Обратите внимание на следующий код:
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 без каких-либо предупреждений. Итак, я хотел бы знать, что С++ 11 (или более поздняя версия) определяет правила в отношении инициализации списка. Спасибо заранее.