为什么当构造函数引用字符串时打印不正确?
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.
我有下面的代码,当它的析构函数被调用时它没有打印出正确的字符串
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.