DR 2137对我来说并不清楚

时间:2017-02-16 20:06:01

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

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的分辨率打破。

1 个答案:

答案 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构造函数而非任何其他构造函数的思想构造函数类型。所以就这样,它是一致的。