为什么还要编译?
struct UE{
UE(bool a = true) { };
// UE(){}; // if UE took no initial args and called below, gcc will complain.
};
class VA {
protected:
UE ue;
public:
VA();
};
VA::VA()
{
ue = new UE(true); // ???why???
// ue = new UE(); // will complain
}
我尝试使用gcc(GCC)4.6.2。
如何分配带有指针的结构?
最佳答案
您遇到的事实是您没有将构造函数标记为explicit
,因此可以将其用于隐式转换。new UE(true)
返回一个指针。所有指针都可以隐式转换为bool
,如果它们为非null,则生成true
。 UE
可以从bool
隐式构造。因此,实际上,new
返回的指针被转换为bool
,使用构造函数将其转换为UE
,然后调用UE
的副本分配运算符。当然,由new
分配的内存已泄漏。
要点是:除非您确实希望单参数构造函数可用于隐式转换,否则始终将其标记为explicit
。 “单参数构造函数”是指可以用单个参数调用的参数。因为它具有一个参数,或者因为它具有更多且第一个参数之后的所有参数都具有默认参数。