C++ 对由类型运算符创建的临时的引用

C++ 对由类型运算符创建的临时的引用,c++,temporary,lifetime,C++,Temporary,Lifetime,假设我们需要一些类来包装std::string,除了所有其他细节之外,它还使用类型转换操作符自动转换回std::string: class MyWrappedString { std::string m_value; /* ... */ public: inline operator std::string() const { return m_value; } }; 因此,操作符将返回包装字符串对象的副本 但是,为什么下面的代码看起来是正确的

假设我们需要一些类来包装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;
那么,上述代码不必在临时副本上工作


PS:这个问题有点与:,但仍然是一个不同的问题。

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


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

如果您有两个单独的问题,请发表两篇单独的帖子。Herb Sutter关于常量引用到临时变量的生命周期的问题:@BenjaminLindley:yes,但很难两次解释它的背景。所以,回答第一个问题的人可能也能回答第二个问题:)我不明白为什么你的第二个问题不可能是真的。转换运算符可以返回您想要的任何内容,包括常量引用。它们只是另一个成员函数。@Alex:thx,这回答了我的第一个问题好的<代码>运算符常量std::string&()常量有效(在VS2010和gcc4中)。我没想到会这样,但它确实有效。尽管如此,一个人不可能同时拥有这两者(有参考和无参考)。谢谢@我相信没有隐式类型转换。。。但是,如果您打算提供它们,最好在您的情况下提供
const std::string&
,因为这让调用方决定是否要复制字符串。@DavidRodríguez dribeas:是的,对,我也不相信隐式类型转换。但是在我的特殊用例中,它非常方便。然而,我仍然非常惊讶,返回常量引用的类型转换操作符能够正常工作。我确信,任何编译器都很难支持这些(因为引用不仅仅是类型,而且有特殊的意义,比如它的扩展生命周期等等…@Frunsi:reference是类型。有一些额外的规则(即通过绑定到
常量&
)来延长生存期),但它们与指针一样多。。。
inline operator const std::string &() const {
    return m_value;
}