【问题标题】:C++ : automatic const?C++:自动常量?
【发布时间】: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


【解决方案1】:

m_String 被视为 const,因为它被访问为

this->m_String

this 是 const,因为成员函数 ToString() 是 const 限定的。

【讨论】:

    【解决方案2】:

    m_String 在这一点上是 const,因为您选择将 方法 声明为 const(这当然也使所有数据实例成员都为 const)——如果您需要绕过该特定数据成员,您可以选择明确地将其设为mutable

    【讨论】:

      【解决方案3】:

      因为方法是 const (std::string& ToString() const 中的 const)。 const 方法将this 视为const 对象,其成员也视为const 对象。

      【讨论】:

        【解决方案4】:

        因为你通过常量this访问m_String(方法是const)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-23
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          相关资源
          最近更新 更多