Следующий код успешно компилируется с большинством современных компиляторов, совместимых с С++ 11 (GCC >= 5.x, Clang, ICC, MSVC).
#include <string>
struct A
{
explicit A(const char *) {}
A(std::string) {}
};
struct B
{
B(A) {}
B(B &) = delete;
};
int main( void )
{
B b1({{{"test"}}});
}
Но зачем он компилируется в первую очередь и как перечисленные компиляторы интерпретируют этот код?
Почему MSVC может скомпилировать это без B(B &) = delete;
, но все остальные 3 компилятора им нужны?
И почему это происходит во всех компиляторах, кроме MSVC, когда я удаляю различную подпись конструктора копирования, например. B(const B &) = delete;
?
Разве компиляторы даже выбирают одни и те же конструкторы?
Почему Clang выдает следующее предупреждение?
17 : <source>:17:16: warning: braces around scalar initializer [-Wbraced-scalar-init]
B b1({{{"test"}}});