【问题标题】:How can a C++ compiler detect a non-const function body?C++ 编译器如何检测非常量函数体?
【发布时间】:2019-07-22 15:15:30
【问题描述】:

偶然发现以下代码:

class Person
{
private:
    char name[10];
public:
    // this won't compile:
    char* getName_1() const {
        return name;
    }
    // this will: 
    const char* getName_2() const {
        return name;
    }
};

我想知道编译器究竟是如何判断 getName_1() 不是 const 函数的。因为函数体内没有一段代码实际上是在修改成员变量。

【问题讨论】:

  • 我不明白这个问题。 getName_1() const 函数。
  • 编译器告诉或不告诉是什么意思?问题不清楚。也许您可能想访问此页面? stackoverflow.com/help/how-to-ask
  • @NathanOliver 是的,但没有任何代码尝试修改数组name - 仅返回其地址。到目前为止,我的思路是,在每个 const 函数中,每个成员都被视为 const 成员,因此无法修改,但显然还有更多...
  • 在每个 const 函数中,每个成员都被视为 const 成员,因此不能修改 这就是它的要点。为什么你认为还有更多?编译器抱怨您使用char* 作为getName_1 的返回类型。您不能这样做,因为在 const 函数中 nameconst char[],而不是 char[]
  • 知道了。只是因为不允许从const char* 转换为char*

标签: c++ compilation compiler-construction


【解决方案1】:

由于getName_1 被标记为const,该类的所有字段都被视为常量。

所以namegetName_1 中的类型是const char[10]

这不能隐式转换为char *(返回类型),所以编译器报错。

【讨论】:

    【解决方案2】:

    getName_1() 一个 const 方法,因为它在其声明中被标记为const。这意味着它的隐式this 指针是const,所以name 成员被视为const,所以getName_1() 不能返回一个非const 指向 的指针>const 数据,这就是它无法编译的原因。

    【讨论】:

      【解决方案3】:

      作为对其他(正确)答案的补充,编译如下:

      class Person
      {
      private:
          char* name;
      public:
          // this compiles:
          char* getName_1() const {
              return name;
          }
      };
      

      最重要的是,这表明与流行的神话相反,C++ 中的数组不是指针。

      【讨论】:

      • 你能扩展一下吗?!这听起来很有趣,但我不太明白其中的原因。
      • 这里没有特别的推理。成员函数上的const 修饰符将所有成员视为const,因此name 变为char* const name。没有什么能阻止您创建另一个非常量指针并将 const 指针 name 的值分配给它。
      猜你喜欢
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 2018-11-13
      相关资源
      最近更新 更多