如何防止使用类类型的const变量的默认初始化

ljb*_*ade 5 c++ initialization const initializer default-constructor

我有一个自定义类,我想表现得像一个内置类型.

但是我注意到你可以在不提供初始值的情况下初始化该类的const变量.我的类目前有一个空的默认构造函数.

这是int和我的类foo的比较:

int a;              // Valid
int a = 1;          // Valid
const int a = 1;    // Valid
const int a;        // Error

foo a;              // Valid
foo a = 1;          // Valid
const foo a = 1;    // Valid
const foo a;        // Should cause an error, but it compiles
Run Code Online (Sandbox Code Playgroud)

如你所见,我需要预防

const foo a;
Run Code Online (Sandbox Code Playgroud)

从编译.

来自C++大师的任何想法?

Dav*_*eas 6

它仅在具有默认构造函数时进行编译,并且由于具有默认构造函数而进行编译,这意味着它已初始化.如果您不想编译该行,只需禁用默认构造函数(也会将foo a;错误视为不必要的副作用).没有foo你想要做的定义或者你想做什么,这是我能得到的.

我认为没有任何方法可以实现你想要的东西(即允许非const变量默认初始化,而const版本失败编译并允许其他用例 - 需要提供构造函数)

  • @arne:我不明白这会有什么帮助.默认构造函数是可访问的,并且都是`foo a; const foo a;`编译,或者它不是,也没有编译.另外,`protected`可能不是最好的方法,因为问题中没有继承,自然选择是`public`来授予访问权限,`private`是禁止它的. (3认同)

Ker*_* SB 3

C++ 的规则简单地说,默认初始化(例如new T;)和值初始化(例如new T();)对于类类型的对象是相同的,但对于基本类型的对象则不同。

您无法做任何事情来“覆盖”这种区别。它是语法的基本部分。如果您的类是可值初始化的,那么它也是可默认初始化的。

对于没有任何用户定义的构造函数的类,有一种例外:在这种情况下,成员的初始化是递归完成的(因此,如果您默认初始化该对象,它会尝试默认初始化所有成员),并且这将失败如果任何班级成员本身就是基本的,或者再次具有这种性质。

例如,考虑以下两个类:

struct Foo { int a; int b; };
struct Goo { int a; int b; Goo(){} };

//const Foo x; // error
const Goo y;   // OK
Run Code Online (Sandbox Code Playgroud)

的隐式构造函数Foo被拒绝,因为它没有初始化基本成员。然而,y很高兴默认初始化,并且y.a现在y.b“故意留空”。

但除非您的类没有任何用户定义的构造函数,否则此信息对您没有帮助。您不能将初始化类型“转发”给成员(例如Foo() : INIT_SAME_AS_SELF(a), b() { })。