在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
Declaring a const object in C ++ requires a user-defined default constructor. If I have a mutable member variable, why not?
在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
可以在以后设置,并且没有未初始化的常量。
相关文章:
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如果你有一个固定大小的数组,你需要遍历它!n次,使用二进制搜索如何改变时间复杂性
- 如何获得GUID编码器,如果我在IMFTransform上有一个指针?
- 如果我们有一个基*类,如何访问派生模板类的成员函数
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 如果有一个几何设计着色器,则如何将信息从顶点着色器传递到碎片着色器
- 如果有一个以上的allindromes,找到最长但词典最小的回文
- 如果我有一个向量(或类似的东西)成员变量,那么move构造函数看起来怎么样
- 如果我有一个类,如何返回一个 jobject?
- 如果我有一个将指针变量作为输入的函数,有没有办法将函数作为参数传递
- 如果没有线程阻塞信号,并且有一个线程处于"sigwait()"中,是否可以保证被阻塞的线程将接收下一
- 如果我在一个类中有一个静态属性,并创建该类的许多新实例
- C++如果我有一个对象指针,是在堆栈或堆上分配的方法变量
- 如果我有一个固定大小的填充ascii数字的char数组,我知道它指的是一个无符号整数,那么将其转换为无符号整数的最快方法
- 如果一个类不是直接从main中使用的,但有一个静态私有成员,那么在编译和链接时,可以使用最大优化来忽略它吗
- 如果你的基类有一个虚拟析构函数,你自己的析构函数就会自动变成虚拟的
- 如果只有一个成员没有默认构造函数,为什么联合有一个已删除的默认构造函数?
- 如果我有一个字符串向量,如何使用带execvp的字符串来执行命令
- (C++内存管理)如果我们有一个 int x = 1234,并且 int &y = x...那么堆栈上 y 的地址是什么?