C++ 标准的哪一部分决定了在位成员相对于初始值设定者列表的优先级?

C++ 标准的哪一部分决定了在位成员相对于初始值设定者列表的优先级?,c++,constructor,initialization,language-lawyer,member-initialization,C++,Constructor,Initialization,Language Lawyer,Member Initialization,我刚刚制作了一个示例,从我个人的角度来看,它不应该编译,或者至少给出一个警告,但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() : f

我刚刚制作了一个示例,从我个人的角度来看,它不应该编译,或者至少给出一个警告,但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{
Foo(inti){throw std::runtime_error(“Oh no:(”);}
Foo(float f){}
};
结构条{
Bar(){}
};
结构Baz{
Baz():foo(5.0f){}
酒吧;
Foo-Foo=Foo(3);
bar2;
};
int main()
{
巴兹巴兹;
}

在我看来(但我不是语言律师),foo的两个初始化(就地与初始化器列表)是不明确的。那么在这种情况下有什么规则呢?

构造函数中提供的值是明确首选的

如果给定的非静态数据成员同时具有默认成员初始值设定项和mem初始值设定项,则执行mem初始值设定项指定的初始化,并忽略非静态数据成员的默认成员初始值设定项


“标准的哪一部分”是什么意思?你是要求引用标准还是其他什么?你只是要求规则吗?引用就可以了,再加上解释就更好了。你赢了我20秒:/这是标准参考:P@RudolfsBundulis就我个人而言,我看不出有什么理由发出警告。我猜在这个人为的例子中,这似乎是一个错误程序员犯了错误,但是有很多理由希望提供一个可重写的默认值(回想一下,您可能有多个构造函数)。好吧,不管怎样,还是有一两个原因。然后你必须禁用警告以关闭它,这是不好的。@Rudolfsfbundulis•我不明白你为什么认为应该有警告。有什么需要警告的?@Eljay将尝试想出好的反例,但首先想到的是-为什么要警告在初始值设定项列表中重新排序,因为你“知道”标准的执行顺序?正如其他人所提到的,如果一个人可能错误地这样做,并期望使用内嵌初始值设定项,这是一个足够好的理由来警告imho。这当然是一个非常边界线的示例,我打算这样构造它,我完全同意在多个CTOR的情况下不应该有警告。