首页 > 解决方案 > 在 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;
}

标签: c++clang++

解决方案


重写我的评论作为答案,希望它可以帮助某人。

如果没有以某种形式初始化,那么声明一个 const 对象是没有意义的。
考虑以下代码:

    const int x;

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

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

    const Some some;

以后还是可以改value的。
例如:

    some.value = 8;

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


推荐阅读