Рассмотрим следующий надуманный пример
struct A {
A(int) {}
A(const A&) = delete;
~A() {}
};
struct B {
A a[2] = {{1}, {2}};
};
int main() {
B b;
}
Он прекрасно компилируется в clang (любая версия), но не в GCC (любая версия, любой стандарт> = С++ 11)
<source>: In constructor 'constexpr B::B()':
<source>:7:8: error: use of deleted function 'A::A(const A&)'
struct B {
^
<source>:3:5: note: declared here
A(const A&) = delete;
^
<source>: In function 'int main()':
<source>:12:7: note: synthesized method 'constexpr B::B()' first required here
B b;
^
Когда деструктор закомментирован, он прекрасно компилируется и в GCC.
Вопрос - кто прав, лязг или GCC и почему?
Первоначально я думал, что GCC не так, но потом я увидел [dcl.init.list]/5, в котором говорится, что создаются временные. Хотя я не уверен, применимо ли это здесь или есть другое правило, которое отменяет это.