Определение экспоненциального макроса препроцессора

Ваша проблема связана с инициализацией агрегата : struct X является агрегатом, а struct Y - нет. Ниже приведена стандартная цитата об агрегатах (8.5.1):

Агрегат - это массив или класс (раздел 9) без конструкторов, предоставляемых пользователем (12.1), без привязки / равные инициализаторы для нестатических членов данных (9.2), без частных или защищенных нестатических данных (раздел 11), без базовых классов (раздел 10) и без виртуальных функций (10.3).

blockquote >

В этом предложении указано, что если class имеет базовый класс, то он не является агрегатом. Здесь struct Y имеет struct X в качестве базового класса и, следовательно, не может быть агрегатным типом.

Что касается конкретной проблемы, которую вы имеете, возьмите следующее предложение из стандарта:

Когда агрегат инициализируется списком инициализаторов, как указано в 8.5.4, элементы списка инициализаторов берутся как инициализаторы для членов агрегата, увеличивая индекс или порядок членов. Каждый член инициализируется копией из соответствующего предложения инициализатора. Если выражение initializer-выражение является выражением, и для преобразования выражения требуется суживающее преобразование (8.5.4), программа плохо сформирована.

blockquote>

Когда вы выполняете X x = {0}, агрегируйте инициализация используется для инициализации a - 0. Однако, когда вы выполняете Y y = {0}, поскольку struct Y не является совокупным типом, компилятор будет искать соответствующий конструктор. Поскольку ни один из неявно сгенерированных конструкторов (по умолчанию, копирование и перемещение) не может делать ничего с одним целым числом, компилятор отклоняет ваш код.


Что касается этого поиска конструкторов, сообщения об ошибках из clang ++ являются немного [):

Y Y = {0};
  ^   ~~~

main.cpp:5:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const Y &' for 1st argument

struct Y : public X {};
       ^

main.cpp:5:8: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'Y &&' for 1st argument

struct Y : public X {};
       ^

main.cpp:5:8: note: candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided

Обратите внимание, что есть предложение ], чтобы расширить инициализацию агрегата для поддержки вашего варианта использования, и , он превратил его в C ++ 17. Если я прочитаю его правильно, это сделает ваш пример действительным с семантикой, которую вы ожидаете. Итак ... вам остается только ждать компилятора, совместимого с C ++ 17.

0
задан xst 8 June 2012 в 17:38
поделиться