在 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
可以稍后设置,并且没有未初始化的常量。
在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
可以稍后设置,并且没有未初始化的常量。