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

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

本文关键字:有一个 如果 成员 变量 为什么不 构造函数 默认 const 声明 C++ 对象      更新时间:2023-10-16

在C++中,要声明具有成员变量的类的对象为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;
}

但是,如果类拥有的成员变量被限定为可变变量,则编译器不会报告任何错误。作为参考,我使用命令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;

叮当说:error: default initialization of an object of const type 'const int'
海湾合作委员会会说:error: uninitialized const ‘x’ [-fpermissive]

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

const Some some;

以后仍然可以更改value
例如:

some.value = 8;

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

相关文章: