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() 来释放对字符串的引用,因为它有一个构造函数作用域吗?
谢谢!
问题是你不能有一个字符串引用 ( std::string const&) 到 a const char[14],即"static Tracer"。
为了使它工作,C++ 发明了一个临时对象std::string{"static Tracer"}。该对象将一直存在,直到您的构造函数返回,但不再存在。static_tracer返回之前的构造函数main开始。显然析构函数也在构造函数返回后运行。