2

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

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

}

输出:构造的静态 Tracer。

“1.Q”</p>

但以下代码按预期工作:

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

private:
std::string name;

输出:构造的静态 Tracer。

静态示踪剂被破坏。

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

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

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

谢谢!

4

1 回答 1

5

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

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

于 2020-04-14T12:03:33.957 回答