为什么 std::variant 在 C++17 中允许 std::variant<int, const int>

Why std::variant in C++17 allows std::variant<int, const int>

本文关键字:variant int std gt lt const C++17 为什么      更新时间:2023-10-16

在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<int, const int> A variant可以处理const类型:它们只能通过variant构造和emplace()来设置。如果const和非const类型都是可选的,即活动类型可选性由常规构造函数实例化/重载选择规则,就像任何其他可能匹配的替代类型。

因此,就基本原理而言,浏览关于替代方案的部分,我们可以说:

  • 对备选类型的要求越少,在模板代码中使用variant就越容易。(否则,在实例化variant之前,模板代码必须遍历类型列表,删除cv限定符,消除重复项,等等。)
  • 允许一般的cv限定类型,特别是具有不同cv限定的相同类型,可以通过从类型的性质中自然流动的语义来实现。