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

ste*_*ios 2 c++ string reference c++17 stdmove

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

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() {

}
Run Code Online (Sandbox Code Playgroud)

输出:构造的静态 Tracer。

?1?问?

但以下代码按预期工作:

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

private:
std::string name;
Run Code Online (Sandbox Code Playgroud)

输出:构造的静态 Tracer。

静态示踪剂被破坏。

或者当使用 stringview 或简单的 sting 时。

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

我们也不应该使用 move() 来释放对字符串的引用,因为它有一个构造函数作用域吗?

谢谢!

MSa*_*ers 5

问题是你不能有一个字符串引用 ( std::string const&) 到 a const char[14],即"static Tracer"

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