【问题标题】:Reference to temporary, which was created by a type operator对临时的引用,它由类型运算符创建
【发布时间】: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&amp; 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:谢谢,这回答了我的第一个问题

标签: c++ temporary lifetime


【解决方案1】:

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

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

【讨论】:

  • 好的。 operator const std::string &amp;() const 有效(在 VS2010 和 gcc4 中)。我没想到会这样,但它确实有效。虽然,一个人不能同时拥有(有和没有参考)。谢谢!
  • @Frunsi:我相信没有隐式类型转换......但如果你要提供它们,最好提供const std::string&amp;,因为这让调用者决定他们是否要复制字符串。
  • @DavidRodríguez-dribeas:是的,没错,我也不相信隐式类型转换。但是在我的特殊用例中,它非常方便。但是,我仍然非常惊讶,返回 const 引用的类型转换运算符可以正常工作。我敢肯定,任何编译器都很难支持这些(因为引用不仅仅是类型,还有特殊含义,比如它的延长生命周期等等......)
  • @Frunsi:参考 are 类型。还有一些额外的规则(即通过绑定到const&amp; 来延长生命周期),但它们与指针一样多是一种类型...