C++编译器如何检测非常量函数体

How can a C++ compiler detect a non-const function body?

本文关键字:非常 常量 函数体 检测 编译器 何检测 C++      更新时间:2023-10-16

偶然发现了以下一段代码:

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()不是常量函数。因为函数体内没有一段代码实际修改成员变量。

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

所以getName_1 name的类型是const char[10].

这不能隐式转换为char *(返回类型(,因此编译器报告错误。

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

作为其他(正确(答案的补充,它编译:

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

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