C++11:乱序实例成员初始化的不一致警告

Tom*_*Tom 5 c++ c++11

以下代码崩溃,引发std::bad_alloc或有时std::logic_error.

#include <string>

class Crasher {
public:
    Crasher() : value(default_value) {}
private:
    std::string value;
    const std::string default_value = "default is yours";
};


int main(void) {
    Crasher();
}
Run Code Online (Sandbox Code Playgroud)

我认为原因是成员初始化顺序不正确,并且value在初始化列表中初始化时default_value尚未初始化。

但是,-Wall启用后我没有收到任何编译器警告或错误。但是,如果我的变化value,并default_value以一个POD类型一样int,然后我从收到了警告g++

$ g++ -Wall crasher.cpp 
crasher2.cpp: In constructor ‘Crasher::Crasher()’:
crasher2.cpp:5:23: warning: ‘*<unknown>.Crasher::default_value’ is used uninitialized in this function [-Wuninitialized]
    5 |     Crasher() : value(default_value) {}
      |              
Run Code Online (Sandbox Code Playgroud)

当类型为 时,为什么我没有收到警告std::string?这是编译器问题,还是语言的怪癖?

Dav*_*ing 2

int从另一个初始化一个会在源上执行左值到右值的转换。如果该\xe2\x80\x99s未初始化,则行为未定义。从类类型的一个对象初始化另一个对象不会这样做\xe2\x80\x94它调用构造函数,该构造函数仅绑定源的引用。即使源已超出生命周期,\xe2\x80\x99 也不是未定义的,尽管典型的复制构造函数在这种情况下当然会表现出未定义的行为。是否收到警告取决于编译器在构造函数内联后所做的分析。默认情况下不进行优化,因此没有收到警告是可以理解的。

\n