Какая часть стандарта определяет приоритет элемента на месте по сравнению со списком инициализатора? - PullRequest
3 голосов
/ 09 мая 2019

Я только что сделал пример, который, с моей личной точки зрения, не должен компилироваться или, по крайней мере, давать предупреждение, но Visual Studio 2017 не выдает никаких предупреждений.Пример следующий:

#include <stdexcept>

struct Foo {
    Foo(int i) { throw std::runtime_error("Oh no:("); }
    Foo(float f) {}
};

struct Bar {
    Bar() {}
};

struct Baz {
    Baz() : foo(5.0f) {}

    Bar bar;
    Foo foo = Foo(3);
    Bar bar2;
};

int main()
{
    Baz baz;
}

С моей точки зрения (но я не адвокат по языку), две инициализации foo (список вместо инициализатора) неоднозначны.Так каковы правила в этом случае?

1 Ответ

7 голосов
/ 09 мая 2019

Значение, предоставленное в вашем конструкторе, является явно предпочтительным.

[class.base.init]/10: Если данный нестатический элемент данных имеет как инициализатор элемента по умолчанию, так и mem-initializer , инициализация определяется mem-initializer выполняется, и инициализатор члена нестатического элемента данных по умолчанию игнорируется.

...