5

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

但是我注意到您可以在不提供初始值的情况下初始化该类的 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

如您所见,我需要防止

const foo a;

从编译。

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

4

2 回答 2

6

只有当它有一个默认构造函数时它才会编译,并且它编译是因为它有它,这意味着它被初始化了。如果您不希望编译该行,只需禁用默认构造函数(也会foo a;产生错误作为不需要的副作用)。如果没有定义foo或您想做什么,这是我所能得到的。

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

于 2011-11-18T12:22:25.830 回答
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

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

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

于 2011-11-18T12:43:33.500 回答