public:
int *i = new int(5); //ok
BASE base; //error 因为会引起递归定义
BASE *base_0 = new BASE(); //error 如何理解?
static const BASE base_1; //ok 因为在全局区分配
static BASE base_2; //ok 因为在全局区分配
~BASE() {
cout << "~";
}
};
BASE *base_0 = new BASE(); //这句错误? 如何理解? 和内存分配时间有关系? 还是说和构造函数时机?
public:
BASE();
int *i = new int(5); //ok
//BASE base; //error 因为会引起递归定义
BASE *base_0 = new BASE(); //error 如何理解?
static const BASE base_1; //ok 因为在全局区分配
static BASE base_2; //ok 因为在全局区分配
~BASE() {
}
};
#11
指针不会递归出错啊。
#12
就样就递归申请了..
#13
new int 那句初始化最终变成所有构造函数的一部分,除非该构造函数的 member init list 里面明确对 int i 初始化了,这时构造函数的初始化优先。
new 操作符要完整类型,BASE 在 BASE 里面的时候还是不完整类型呢,所以出错。
在这里BASE被认为是完整类型。参见N4606/class.mem/Paragraph 6:
... Within the class member-specification, the class is regarded as complete within function bodies,
default arguments, exception-specifications, and default member initializers (including such things in nested
classes). ...
比如
class A {
A() : p(nullptr) {}
A *p = new A; // 可以通过编译
};
嗯,你说的对,我疏忽了。default member init 是新加的,我以为没有特权呢。主楼的错误是因为缺默认构造函数。
#14
new int 那句初始化最终变成所有构造函数的一部分,除非该构造函数的 member init list 里面明确对 int i 初始化了,这时构造函数的初始化优先。
new 操作符要完整类型,BASE 在 BASE 里面的时候还是不完整类型呢,所以出错。
... A brace-or-equal-initializer for a non-static data member specifies a default member initializer for the member,
and shall not directly or indirectly cause the implicit definition of a defaulted default constructor for the enclosing class or the exception specification of that constructor.
#4
new int 那句初始化最终变成所有构造函数的一部分,除非该构造函数的 member init list 里面明确对 int i 初始化了,这时构造函数的初始化优先。
new 操作符要完整类型,BASE 在 BASE 里面的时候还是不完整类型呢,所以出错。
#5
new int 那句初始化最终变成所有构造函数的一部分,除非该构造函数的 member init list 里面明确对 int i 初始化了,这时构造函数的初始化优先。
new 操作符要完整类型,BASE 在 BASE 里面的时候还是不完整类型呢,所以出错。
在这里BASE被认为是完整类型。参见N4606/class.mem/Paragraph 6:
... Within the class member-specification, the class is regarded as complete within function bodies,
default arguments, exception-specifications, and default member initializers (including such things in nested
classes). ...
比如
class A {
A() : p(nullptr) {}
A *p = new A; // 可以通过编译
};
new int 那句初始化最终变成所有构造函数的一部分,除非该构造函数的 member init list 里面明确对 int i 初始化了,这时构造函数的初始化优先。
new 操作符要完整类型,BASE 在 BASE 里面的时候还是不完整类型呢,所以出错。
在这里BASE被认为是完整类型。参见N4606/class.mem/Paragraph 6:
... Within the class member-specification, the class is regarded as complete within function bodies,
default arguments, exception-specifications, and default member initializers (including such things in nested
classes). ...
比如
class A {
A() : p(nullptr) {}
A *p = new A; // 可以通过编译
};
嗯,你说的对,我疏忽了。default member init 是新加的,我以为没有特权呢。主楼的错误是因为缺默认构造函数。
#14
new int 那句初始化最终变成所有构造函数的一部分,除非该构造函数的 member init list 里面明确对 int i 初始化了,这时构造函数的初始化优先。
new 操作符要完整类型,BASE 在 BASE 里面的时候还是不完整类型呢,所以出错。