请考虑以下代码:
class A {
private:
std::string s;
public:
A() = delete;
A(const A&) = delete;
A(A&&) = delete;
A(const std::string &a) : s(a) {}
};
Run Code Online (Sandbox Code Playgroud)
现在,我想初始化一个使用列表初始化的A数组.g ++(4.9.1)可以成功构建以下代码:
int main() {
A arr[2] = {{"a"}, {"b"}};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,它失败了以下代码:
class Aggr {
private:
A arr[2];
public:
Aggr() : arr{{"a"}, {"b"}} {}
};
Run Code Online (Sandbox Code Playgroud)
错误消息是,
test.cc: In constructor ‘Aggr::Aggr()’:
test.cc:22:28: error: use of deleted function ‘A::A(A&&)’
Aggr() : arr{{"a"}, {"b"}} {}
^
test.cc:11:3: note: declared here
A(A&&) = delete;
^
Run Code Online (Sandbox Code Playgroud)
也就是说,list-initializer尝试调用move构造函数来初始化类中的数组.但是,该代码是由clang v3.5成功构建的,没有任何警告.所以,我想知道C++ …