在DR 2137中,我们有以下文字(重点是我的):
在以下代码中不清楚选择复制/移动 当初始化列表包含a时,构造函数是正确的选择 正如问题所要求的那样,正在初始化的类型的单个元素 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的分辨率打破。
答案 0 :(得分:1)
DR 2147有这样的陈述:&#34;意图是Q
个对象可以包含其他Q
个对象&#34;。鉴于此,它假定如果用户从包含其他Q
的braced-init-list构造Q
,则用户的意图是调用initializer_list
构造函数。 / p>
鉴于这种假设,它因此被打破了#34; not 调用initializer_list
构造函数,这将构成1467。
你是否同意这个逻辑,这是2147背后的思考。它也是允许[over.match.list]优先考虑initializer_list
构造函数而非任何其他构造函数的思想构造函数类型。所以就这样,它是一致的。