为什么 C++17 中的 std::variant 允许 std::variant<int, const int>
Why std::variant in C++17 allows std::variant<int, const int>
在 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0088r3.html 中有一个关于需要扩展 std::variant<int, const int>
的注释,并投票允许它,但我找不到实际的理由。
那么为什么允许 std::variant<int, const int>
有意义?
本文早期版本中存在的基本原理和讨论部分已分为 P0086 - Variant design review。
相关段落说:
variant<int, const int>
A variant
can handle const
types: they
can only be set through variant
construction and emplace()
. If
both const
and non-const
types are alternatives, the active
alternative is chosen by regular constructor instantiation / overload
rules, just as for any other possibly matching alternative types.
因此,就基本原理而言,查看替代方案部分我们可以说:
- 对替代类型的要求越少,在模板代码中使用
variant
就越容易。 (否则,模板代码必须通过类型列表、删除 cv 限定符、消除重复项等,然后才能用它们实例化 variant
。)
- 一般允许 cv 限定类型,特别是具有不同 cv 限定的相同类型,可以使用从类型的性质自然流出的语义来实现。
在 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0088r3.html 中有一个关于需要扩展 std::variant<int, const int>
的注释,并投票允许它,但我找不到实际的理由。
那么为什么允许 std::variant<int, const int>
有意义?
本文早期版本中存在的基本原理和讨论部分已分为 P0086 - Variant design review。
相关段落说:
variant<int, const int>
Avariant
can handleconst
types: they can only be set throughvariant
construction andemplace()
. If bothconst
and non-const
types are alternatives, the active alternative is chosen by regular constructor instantiation / overload rules, just as for any other possibly matching alternative types.
因此,就基本原理而言,查看替代方案部分我们可以说:
- 对替代类型的要求越少,在模板代码中使用
variant
就越容易。 (否则,模板代码必须通过类型列表、删除 cv 限定符、消除重复项等,然后才能用它们实例化variant
。) - 一般允许 cv 限定类型,特别是具有不同 cv 限定的相同类型,可以使用从类型的性质自然流出的语义来实现。