【发布时间】: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&&)还是Q(std::initializer_list<Q>)。 DR1467 让它调用Q(Q&&),DR2137 建议它调用Q(std::initializer_list<Q>)。这是否回答你的问题 ? (如果不是,那么可能会更详细地了解您的问题) -
@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