假设我们需要一些类来包装 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,但仍然是一个不同的问题。