【发布时间】:2026-02-10 15:45:02
【问题描述】:
假设我们需要一些类来包装std::string,除了所有其他细节之外,它还使用类型转换运算符自动转换回std::string:
class MyWrappedString {
std::string m_value;
/* ... */
public:
inline operator std::string() const {
return m_value;
}
};
因此,操作符将返回一个被包装的字符串对象的副本。
但是,为什么下面的代码看起来是正确的?
MyWrappedString x;
const std::string& y = x;
// now, y should be a reference to a temporary, right?
std::cout << "y is: " << y << std::endl;
转换运算符将返回 m_value 的临时副本,因此const std::string& y = x 将创建对该临时副本的引用。
为什么会这样?我记得有一些引用对象的生命周期延长,但我不确定。
第二个问题:是否有可能有一个类型转换运算符返回一个 const 引用?
例如:
inline operator const std::string &() const {
return m_value;
}
那么,上面的代码不必在临时副本上工作吗?
PS:这个问题有点关系到:Lifetime of temporaries,但还是一个不同的问题。
【问题讨论】:
-
如果您有两个单独的问题,请发表两个单独的帖子。
-
Herb Sutter 关于 const 对临时对象的引用的生命周期的问题:herbsutter.com/2008/01/01/…
-
@BenjaminLindley:是的,但是很难解释两次它的上下文。所以,回答问题 1 的人也可能回答问题 2 :)
-
我不明白你的第二个问题为什么不成立。您的转换运算符可以返回您想要的任何内容,包括 const 引用。它们只是另一个成员函数。
-
@Alex:谢谢,这回答了我的第一个问题