以下代码崩溃,引发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?这是编译器问题,还是语言的怪癖?
int从另一个初始化一个会在源上执行左值到右值的转换。如果该\xe2\x80\x99s未初始化,则行为未定义。从类类型的一个对象初始化另一个对象不会这样做\xe2\x80\x94它调用构造函数,该构造函数仅绑定对源的引用。即使源已超出生命周期,\xe2\x80\x99 也不是未定义的,尽管典型的复制构造函数在这种情况下当然会表现出未定义的行为。是否收到警告取决于编译器在构造函数内联后所做的分析。默认情况下不进行优化,因此没有收到警告是可以理解的。
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |