为什么还要编译?

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,则生成trueUE可以从bool隐式构造。因此,实际上,new返回的指针被转换为bool,使用构造函数将其转换为UE,然后调用UE的副本分配运算符。当然,由new分配的内存已泄漏。

要点是:除非您确实希望单参数构造函数可用于隐式转换,否则始终将其标记为explicit。 “单参数构造函数”是指可以用单个参数调用的参数。因为它具有一个参数,或者因为它具有更多且第一个参数之后的所有参数都具有默认参数。

10-08 18:59