【问题标题】:DR 2137 is not clear to meDR 2137 我不清楚
【发布时间】:2017-02-16 20:06:01
【问题描述】:

DR 2137 我们有以下文字(重点是我的):

在如下代码中不清楚选择复制/移动 当初始化列表包含一个 根据问题的要求,被初始化的类型的单个元素 1467:

#include <initializer_list>
#include <iostream>

struct Q {
    Q() { std::cout << "default\n"; }
    Q(Q const&) { std::cout << "copy\n"; }
    Q(Q&&) { std::cout << "move\n"; }
    Q(std::initializer_list<Q>) { std::cout << "initializer list\n"; }
};

int main() {
    Q x = Q { Q() };
}

这里的意图是Q 对象可以包含其他Q 对象,但是 问题 1467 的解决方案打破了这一点

我想了解为什么上面的代码会被issue 1467的分辨率破坏。

【问题讨论】:

  • 嗯,问题是Q { Q() }; 应该调用Q(Q&amp;&amp;) 还是Q(std::initializer_list&lt;Q&gt;)。 DR1467 让它调用Q(Q&amp;&amp;),DR2137 建议它调用Q(std::initializer_list&lt;Q&gt;)。这是否回答你的问题 ? (如果不是,那么可能会更详细地了解您的问题)
  • @M.M 这清楚地回答了我的问题。但是为什么2137给出的解比1467好呢?如果您愿意,请填写问题的答案,以便我可以关闭线程。谢谢。
  • 我不能说为什么一个比另一个更好
  • 有关导致 2137 的讨论,请参阅 bugs.llvm.org/show_bug.cgi?id=23812。有关此模式的具体示例,请参阅github.com/dropbox/json11/issues/86

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


【解决方案1】:

DR 2147 有这样的声明:“意图是 Q 对象可以包含其他 Q 对象”。鉴于此,它假设如果用户从包含其他 Qs 的花括号初始化列表构造 Q,则用户的意图是调用 initializer_list 构造函数。

鉴于该假设,因此 调用 initializer_list 构造函数是“不正确的”,而 1467 会导致该构造函数。

不管你是否同意这个逻辑,这就是 2147 背后的想法。这也是允许 [over.match.list] 将initializer_list 构造函数优先于任何其他构造函数类型的想法。所以这样说是一致的。

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2013-02-28
    • 2020-01-29
    • 1970-01-01
    相关资源
    最近更新 更多