举个例子:
class Foo {
private:
const std::string m_str1;
const std::string m_str2;
std::string foo() {
std::cout << ("'" + m_str2 + "'") << std::endl;
return "whatever1";
}
public:
Foo() : m_str1(foo()), m_str2("whatever2") { }
};
int main() {
Foo foo;
return 0;
}
在我的计算机上,它打印出''(两个单引号一个接一个),表明在执行构造函数列表之前,m_str2实际上已初始化为空字符串。
但总的来说这是真的吗?
答案 0 :(得分:7)
正如克里斯评论的那样,Foo
的构造将按顺序:
m_str1
m_str2
您注意到在m_str1
初始化期间,m_str2
尚未初始化。
m_str2
已将不值初始化为空字符串,正如您所说。
当时访问m_str2
undefined behavior 。
答案 1 :(得分:4)
这是未定义的行为。调用m_str2
时尚未构造foo()
。它似乎有效的事实可能是巧合。