【问题标题】:Why std::variant in C++17 allows std::variant<int, const int>为什么 C++17 中的 std::variant 允许 std::variant<int, const int>
【发布时间】:2017-03-18 21:28:29
【问题描述】:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0088r3.html 中有一条关于需要扩展std::variant&lt;int, const int&gt; 并投票支持它的注释,但我找不到真正的理由。

那么为什么允许std::variant&lt;int, const int&gt; 有意义呢?

【问题讨论】:

  • 您为什么不阅读该链接?它很好地解释了基本原理。它实际上在介绍的第一行中解释了它。
  • 对不起@EliSadoff,介绍的第一行说“C++17需要一个类型安全的联合:”,你能扩展一下吗?
  • C++ 目前没有类型安全的联合,并且允许 int const int 联合允许存在类型安全的联合。这将有助于减少不安全的类型异常。提案中包含的代码就是为什么需要这样做的一个示例。
  • @BaummitAugen:“鉴于他们对此进行了投票并获得了 1 票中立票、1 票弱反对票甚至 1 票强烈反对票,因此变体是否应该支持这一点似乎并不清楚。 i>" 仍然有绝大多数人支持它。这显示了标准委员会的共识。
  • 部分章节已从文档的更高版本中删除。您可以找到一些详细信息的早期版本是N4450

标签: c++ c++17


【解决方案1】:

本文早期版本中的基本原理和讨论部分已被分成P0086 - Variant design review

相关段落说:

variant&lt;int, const int&gt; 一个variant 可以处理const 类型:他们 只能通过variant构造和emplace()来设置。如果 const 和非const 类型都是可选的,活动的 通过常规构造函数实例化/重载选择替代方案 规则,就像任何其他可能匹配的替代类型一样。

因此,就基本原理而言,查看替代方案部分,我们可以说:

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

【讨论】:

    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2017-03-05
    • 2019-10-11
    • 2020-07-28
    • 1970-01-01
    相关资源
    最近更新 更多