【发布时间】:2010-07-10 17:28:00
【问题描述】:
当我编译这段代码时:
class DecoratedString
{
private:
std::string m_String;
public:
// ... constructs, destructors, etc
std::string& ToString() const
{
return m_String;
}
}
我从 g++ 收到以下错误:invalid initialization of reference of type 'std::string&" from expression of type 'const std::string'。
为什么 m_String 被视为 const?编译器不应该在这里简单地创建一个引用吗?
编辑:
此外,我应该怎么做才能让这个函数转换为在大多数情况下都可以使用的字符串?我将函数设为 const,因为它不会修改内部字符串...也许我只需要让它返回一个副本...
编辑:好的……让它返回一份工作。
【问题讨论】:
-
当然,您可以让函数返回
const std::string&。 -
@James McNellis - const 意味着......引用是恒定的,或者引用中的数据是恒定的?抱歉,昨天刚阅读 Herb Sutter 关于 const-correctness 的论文,我正在尝试学习如何在我的代码中更有效地使用 const。
-
@sheepsimulator:这将使它成为对 const 对象的引用,就像
const std::string*将是指向 const 对象的指针一样。由于无法重新绑定引用(即,一旦初始化引用以引用某个对象,它就永远不能引用任何其他对象),“常量引用”(即std::string& const)的概念是无意义的。 -
@James McNellis - 好点。我会这样做。
-
因为它是无意义的,但是,“const reference”的概念是明确的,并且指的是“const T&”。 (这个概念是标准库文档中的现有做法)。因此,当您指的是引用 const 对象的引用时,不要害怕说“const 引用”——这没有错。
标签: c++ const-correctness