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++大师的任何想法?
它仅在具有默认构造函数时进行编译,并且由于具有默认构造函数而进行编译,这意味着它已初始化.如果您不想编译该行,只需禁用默认构造函数(也会将foo a;
错误视为不必要的副作用).没有foo
你想要做的定义或者你想做什么,这是我能得到的.
我认为没有任何方法可以实现你想要的东西(即允许非const变量默认初始化,而const版本失败编译并允许其他用例 - 需要提供构造函数)
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() { }
归档时间: |
|
查看次数: |
871 次 |
最近记录: |