在 C++ 中声明一个 const 对象需要一个用户定义的默认构造函数。如果我有一个可变成员变量,为什么不呢?

Declaring a const object in C ++ requires a user-defined default constructor. If I have a mutable member variable, why not?

在C++中,要声明一个class的对象,其成员变量为const,我们必须有一个用户定义的默认构造函数。以下代码说明了这一点。

class Some {
    int value;
};

int main() {
    // error: default initialization of an object of const type 'const Some'
    //        without a user-provided default constructor
    const Some some;

    return 0;
}

但是,如果class拥有的成员变量被限定为可变的,编译器将不会报告任何错误。作为参考,我使用命令 clang++ -std=c++17 -stdlib=libc++ helloworld.cpp -o helloworld.out --debug 进行了编译。我想知道这个结果是由于编译器中的错误还是根据 C++ 语言中定义的语法。

class Some {
    mutable int value;
};

int main() {
    const Some some;

    return 0;
}

重写我的评论作为答案,希望对大家有所帮助。

如果未以某种形式初始化,则声明 const 对象毫无意义。
考虑以下代码:

    const int x;

clang 说:error: default initialization of an object of const type 'const int'.
gcc 会说:error: uninitialized const ‘x’ [-fpermissive]

这背后的逻辑是在这种类型的声明中没有意义
x 的值永远不会改变,因此这段代码将无法预测,因为 x 将映射到未初始化的内存。
在您的示例中,将关键字 mutable 添加到 value 意味着尽管 Some 实例在声明为时是常量:

    const Some some;

以后还可以改value
例如:

    some.value = 8;

这意味着可以以可预测的方式使用此代码,因为 value 可以稍后设置,并且没有未初始化的常量。