1

举个例子:

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 实际上是在执行构造函数列表之前将值初始化为空字符串。

但总的来说这是真的吗?

4

2 回答 2

7

Foo正如克里斯评论的那样,遗嘱的构建顺序

  • 初始化m_str1
  • 初始化m_str2
  • 运行(空)构造函数体

您正在观察,在初始化期间m_str1m_str2尚未初始化。

m_str2如您所说,尚未将值初始化为空字符串

m_str2那时访问是未定义的行为

于 2013-02-11T01:39:51.047 回答
4

这是未定义的行为。 调用m_str2时尚未构造。foo()它似乎起作用的事实可能是巧合。

于 2013-02-11T01:39:46.257 回答