0

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

4

1 回答 1

2

const引用使引用保持活动状态(即使它通常会超出范围),直到 const 引用超出范围

对于第二个问题:是的,您可以返回一个 const 引用,并且必须将函数的返回值分配给一个 const 引用

于 2012-06-19T16:45:15.780 回答