次のコードを検討してください。
class A {
private:
std::string s;
public:
A() = delete;
A(const A&) = delete;
A(A&&) = delete;
A(const std::string &a) : s(a) {}
};
ここで、リストの初期化を使用して A の配列を初期化したいと思います。g++ (4.9.1) は、次のコードを正常にビルドできました。
int main() {
A arr[2] = {{"a"}, {"b"}};
return 0;
}
ただし、次のコードでは失敗しました。
class Aggr {
private:
A arr[2];
public:
Aggr() : arr{{"a"}, {"b"}} {}
};
エラーメッセージは、
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;
^
つまり、リスト初期化子は、クラス内の配列を初期化するために移動コンストラクターを呼び出そうとします。ただし、そのコードは、clang v3.5 によって警告なしで正常にビルドされました。ですから、C++11 (またはそれ以降のバージョン) がリストの初期化に関してどのような規則を指定しているかを知りたいです。前もって感謝します。