c++ - 在 C++ 中声明 const 对象需要用户定义的默认构造函数。如果我有一个可变成员变量,为什么不呢?
问题描述
在 C++ 中,要声明具有成员变量 as 的类的对象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'
。
gcc会说:error: uninitialized const ‘x’ [-fpermissive]
这背后的逻辑是这种声明没有意义。
的值x
永远不会改变,因此该代码将是不可预测的,因为它x
会映射到未初始化的内存。
在您的示例中,添加关键字mutable
tovalue
意味着尽管Some
实例在声明为时是常量:
const Some some;
以后还是可以改value
的。
例如:
some.value = 8;
这意味着可以以可预测的方式使用此代码,因为value
可以稍后设置,并且没有未初始化的常量。
推荐阅读
- javascript - 如何在反应 js 中将值推送到 url?
- c# - 从 Core 3.1 和 Standard 2.0 引用 EntityObject 的正确方法是什么
- amazon-web-services - 无法使用 Cognito 访问基于 nginx 的 AWS Kibana VPC
- sql - 创建易失性表和插入数据的问题 - teradata
- r - 寻找一个 R 函数来为 csv 中的每一行创建一个单独的 txt 文件
- pandas - Pandas:按每个基本级别的最近日期过滤具有多索引的数据框
- c# - 当 DropDownList 的文本与值不匹配时,相似项将强制选择最顶部的相似项
- javascript - Redux:在没有它的情况下使用 compose() 或 applyMiddleware 之间的区别?
- node.js - Mongoose:是否可以对所有包含子字符串的 json 进行查询?
- c++ - 功能模板和缩写功能模板之间的等价关系