【发布时间】:2020-07-27 03:30:23
【问题描述】:
我有下面的代码,当它的析构函数被调用时它没有打印出正确的字符串
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�
但以下代码按预期工作:
Tracer( std::string name_in)
: name{ std:move(name_in) } {
std::cout << name << " constructed.\n";
}
private:
std::string name;
输出: 静态 Tracer 构造。
静态追踪器被破坏。
或者当使用字符串视图或简单的字符串时。
在第一个代码的程序终止期间,我们如何丢失了对字符串的引用?
难道我们不应该使用 move() 释放对字符串的引用,因为它具有构造函数作用域吗?
谢谢!
【问题讨论】:
-
因为这就是 C++ 的工作方式。构造一个临时对象,存储对临时对象的引用,销毁临时对象;最后尝试取消引用现在的垃圾引用,随之而来的是希拉里。你的 C++ 书应该有很多章节来讨论引用的要点和作用域的生命周期。这是一个很大的主题,无法在 stackoverflow.com 上的一两段中完全解释,所有细节都必须参考您的教科书。
-
如果您想要
std::string,请使用std::string。当您想要引用其他对象时,引用很有用。无意冒犯,但这里的问题是你自己不知道会员指的是什么 -
...简单地说:
const std::string& name;->const std::string name; -
甚至不必是
const std::string name;。会员是你自己的。如果你愿意,它可以是非常量的。 -
请注意,C++ 中的“引用”与 Java(和许多其他语言)等语言中的“引用”不同。
标签: c++ string reference c++17 stdmove