В C++ 11 мы можем инициализировать в классе с помощью «скользящего или равного инициализатора» (слова от стандарта), как это:C++ 11: инициализация in-class с «= {}» не работает с явным конструктором
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)’
Я нашел это удивительным. Действительно ли это намерение стандарта C++ 11, что этот код не компилируется?
Снятие =
фиксирует это: Foo foo { 42 };
, но я лично считаю это труднее объяснить людям, которые были использованы в форме с =
на протяжении десятилетий, и так как стандарт относится к «распорки или равно-инициализаторе» это неясно, почему хороший старый способ не работает в этом сценарии.
Синтаксис '{}' инициализатора является своего рода хаком, и у него есть куча странных угловых случаев, подобных этому –
Я думал, что вам нужно использовать двойные фигурные скобки - попробуйте с помощью 'Foo foo = {{42}};' –
@CarlBurnett: двойные фигурные скобки, похоже, делают то же самое, что и отдельные фигурные скобки - все еще сломанные. –