为什么当构造函数引用字符串时打印不正确?

Why when a constructor has a reference to string does not printed correctly?

我有下面的代码,当它的析构函数被调用时它没有打印出正确的字符串

struct Tracer {

 Tracer( const std::string& name_in)
 : name{ name_in } {
  std::cout << name << " constructed.\n";
 }

~Tracer() {
 std::cout << name << " destructed.\n";
}

private:

const std::string& name;
};

Tracer static_tracer{ "static Tracer" };

int main() {

}

输出: 构建静态示踪剂。

�1�Q�

但以下代码按预期工作:

Tracer( std::string name_in)
 : name{ std:move(name_in) } {
 std::cout << name << " constructed.\n";
 }

private:
std::string name;

输出: 构建静态示踪剂。

静态追踪器已损坏。

或者当使用字符串视图或简单字符串时。

我们是如何在第一个代码中的程序终止期间丢失对字符串的引用的?

此外,我们不应该使用 move() 松开对字符串的引用,因为它具有构造函数作用域吗?

谢谢!

问题是您不能对 const char[14] 进行字符串引用 (std::string const&),即 "static Tracer".

为了让它工作,C++ 发明了一个临时对象 std::string{"static Tracer"}。该对象将一直存在到您的构造函数returns、,但不再main 之前 static_tracer returns 的构造函数开始。显然析构函数也在构造函数之后运行 returns.