【问题标题】:Relaxation of copy initialization requirements in C++17放宽 C++17 中的复制初始化要求
【发布时间】:2018-02-17 04:05:56
【问题描述】:

我对@9​​87654321@ 声明感到困惑:

[...] 转换的结果,它是一个 prvalue 表达式(因为 C++17) 如果使用了转换构造函数,则用于 直接初始化对象。 最后一步通常是优化出来的,结果 转换直接在分配给 目标对象,但适当的构造函数(移动或复制)是 即使未使用,也需要可访问。 (直到 C++17)

我在 gcc 8.0.1 上测试了代码 std::atomic_int atom = 1;,它使用 C++17 编译,但 fails 使用 C++14 编译,但出现以下错误:

error: use of deleted function 'std::atomic<int>::atomic(const std::atomic<int>&)'
   std::atomic_int atom = 1;
                          ^

这是否意味着(总是?)不再需要在 C++17 中访问适当的构造函数(移动或复制)?

【问题讨论】:

    标签: c++ initialization language-lawyer c++17 copy-initialization


    【解决方案1】:

    如果copy elision 在 C++17 中是强制,则永远不会使用这些构造函数。在这种情况下,无需检查。

    在早期版本中,省略只是可选的,需要访问检查才能在编译器之间获得一致的结果。对于省略不是强制性的情况,仍然会在 C++17 中发生。

    【讨论】:

    • 那么要编写可移植代码,不应该假设没有检查构造函数的可访问性,对吧?
    • @Lingxi:如果你想用 C++14 移植,你必须遵循 C++14 的规则。
    • @NicolBolas 假设我想使用 C++17 进行移植。尽管如此,是否执行可访问性检查取决于是否强制复制省略,标准没有规定。
    • @Lingxi:“假设我想使用 C++17 进行移植。”这是什么意思?您正在编写在 C++14 中编译的代码(C++17 向后兼容)或在 C++17 中编译的代码(C++14 不一定向前兼容)。
    • @Lingxi - 当然,强制复制省略的情况在 C++17 标准中指定的。我没有引用任何内容,因为我从未尝试使用私有移动构造函数返回一个对象,所以也没有费心去找出它现在何时可以工作(或不工作)。
    猜你喜欢
    • 2020-01-29
    • 2017-07-01
    • 2022-01-06
    • 1970-01-01
    • 2018-10-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    相关资源
    最近更新 更多