конструктор initializer_list с аргументом по умолчанию

Я определяю ctor списка инициализаторов (ctor последовательности) в классе и даю ему аргумент по умолчанию следующим образом:

class Box 
{
public:
    Box(std::initializer_list<XMFLOAT3> vertices = {XMFLOAT3(), XMFLOAT3(), XMFLOAT3(), XMFLOAT3(), XMFLOAT3(), XMFLOAT3(), XMFLOAT3(), XMFLOAT3()});
    ~Box();
    void SetVertices(std::initializer_list<XMFLOAT3> vertices);
    XMFLOAT3 (&GetVertices())[8];
    Mesh &GetMesh() { return mMesh; }
private:
    XMFLOAT3 mVertices[8];
    Mesh mMesh;
};

но когда я помещаю объект типа Box в другой класс, компилятор жалуется, что нет доступного ctor по умолчанию. Почему?

ИЗМЕНИТЬ, если я вызываю ctor по умолчанию в список инициализации ctor содержащего класса:

Bone::Bone(std::string const &name) : mName(name), mCollisionBox{}
{
}

(Я понимаю, что когда присутствует ctor initializer_list, нотация скобок сначала вызывает ctor по умолчанию, а не ctor initializer_list с пустым списком), он вызывает ctor по умолчанию.

Ctor по умолчанию также вызывается, если я его явно вызываю:

Bone::Bone(std::string const &name) : mName(name), mCollisionBox()
{
}

Я использую VisualC++ с Visual Studio 2017, это действительно странно.

ИЗМЕНИТЬ 2

в этом примере это работает, но, как я указал в закомментированной строке, это не так в VS 2017.

http://coliru.stacked-crooked.com/a/e1de3b215c6c4634


person Luca    schedule 05.10.2018    source источник
comment
В качестве минимального воспроизводимого примера это работает нормально: Живое демо на coliru. (Я знаю, что VS2013 и списки инициализаторов... - плохая история.)   -  person Scheff's Cat    schedule 05.10.2018
comment
@Scheff, что, если вы удалите явный вызов ctor по умолчанию Box в списке инициализаторов ctor Other?   -  person Luca    schedule 05.10.2018
comment
Пробовал раньше (и сейчас снова). Он также компилируется. Но это g++ 8.1.0 с -std=c++14. Текущая демонстрация на coliru   -  person Scheff's Cat    schedule 05.10.2018
comment
Я также не могу воспроизвести... coliru.stacked-crooked.com/a/ffe46d5001b04650 ... Что такое точное сообщение об ошибке и где оно появляется? Опубликуйте mcve. Это просто становится игрой в угадайку прямо сейчас...   -  person user1810087    schedule 05.10.2018
comment
Я снова попробовал на godbolt (где я могу выбрать MSVC): Живое демо на godbolt .   -  person Scheff's Cat    schedule 05.10.2018
comment
Не могли бы вы добавить точную ошибку, которую вы получаете, и MCVE, как того требует Шефф? Я также не могу воспроизвести вашу ошибку с VS2017.   -  person divinas    schedule 05.10.2018
comment
@divinas опубликовал   -  person Luca    schedule 05.10.2018
comment
Версия MSVC на godbolt может быть самой последней. (Внизу он указан как Version 19.10.25017.) Вы можете сравнить его с тем, который используется на вашей стороне. Может быть, простое обновление поможет. (Как я уже говорил, в очень старой версии с VS2013 это не работает. Похоже, MS приложила определенные усилия, чтобы исправить свои проблемы со списками инициализаторов, и я не знаю, в какой версии эти исправления стали доступны.)   -  person Scheff's Cat    schedule 05.10.2018
comment
Я все еще не могу воспроизвести вас на вашем примере. Я компилирую с VS 15.7.3, с /std:C++14 или /std::C++17 и /Wall. Это моя полная командная строка для полноты: errorReport:prompt/WX-/Zc:forScope/RTC1/Gd/Oy-/MDd/std:c++17/FC/FaDebug\/EHsc/nologo/FoDebug\/FpDebug\Testy.pch/diagnostics:classic   -  person divinas    schedule 05.10.2018
comment
MSDN заявлено: В Visual Studio 2015 и более ранних версиях агрегату не разрешается иметь инициализаторы с фигурными скобками или равенством для нестатических элементов. Это ограничение было удалено в стандарте C++14 и реализовано в Visual Studio 2017. но они не упоминают актуальную версию... Что касается /std:C++14 (упоминается @divinas): что вы используете?   -  person Scheff's Cat    schedule 05.10.2018
comment
@Scheff, который я использую по сравнению с 2017 годом   -  person Luca    schedule 05.10.2018
comment
Я только что нашел это: MSDN: /std (укажите стандартную версию языка). Невозможно указать что-то меньшее, чем c++14.   -  person Scheff's Cat    schedule 05.10.2018
comment
Я просто пытался узнать, как можно запросить у ВК его версию. В g++ (и, возможно, clang тоже) это просто g++ --version. В VS2013 я открыл консоль и набрал cl. Среди прочего, мне рассказали версию: Microsoft (R) C/C++-Optimierungscompiler Version 18.00.40629 für x64. Это должно быть как-то возможно также в/для VS2017.   -  person Scheff's Cat    schedule 05.10.2018


Ответы (1)


Вы задаете неправильный вопрос, потому что то, о чем вы просите, совершенно законно. Может быть, ошибка в чем-то другом, или вам нужно предоставить минимальный и полный пример.

person darune    schedule 05.10.2018
comment
когда я помещаю объект типа Box в другой класс, компилятор жалуется, что нет доступного ctor по умолчанию. Почему? - person Luca; 05.10.2018
comment
Он отлично работает - вы должны предоставить рабочий пример и минимальный. - person darune; 05.10.2018
comment
Я использую VIsualC++ в Visual Studio 2017. - person Luca; 05.10.2018