В С++ 11 мы можем выполнить инициализацию в классе с помощью "скобки-или-равного-инициализатора" (слова из стандарта), например:
struct Foo
{
/*explicit*/ Foo(int) {}
};
struct Bar
{
Foo foo = { 42 };
};
Но если мы не будем комментировать explicit
, он больше не компилируется. GCC 4.7 и 4.9 говорят следующее:
error: converting to ‘Foo’ from initializer list would use explicit constructor ‘Foo::Foo(int)’
Я нашел это удивительным. Действительно ли это намерение стандарта С++ 11, что этот код не компилируется?
Удаление =
исправляет его: Foo foo { 42 };
, но я лично затрудняюсь объяснить людям, которые были использованы в форме с помощью =
в течение десятилетий, и поскольку стандарт относится к "скобке или равный-инициализатор" не очевидно, почему старый старый способ не работает в этом сценарии.