为什么我可以用指针赋予struct?

Bet*_*ang 24 c++ implicit-conversion

为什么甚至编译?

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
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用gcc(GCC)4.6.2.如何使用指针分配结构?

Rei*_*ica 29

您确实没有将构造函数标记为explicit,因此可以将其用于隐式转换.

new UE(true)返回一个指针.所有指针都可以隐式转换为bool,从而导致true它们非空.UE可以隐含地构造一个bool.所以实际上,返回的指针new被转换为bool,UE使用你的构造函数转换为,然后UE调用复制赋值运算符.当然,分配的内存new被泄露了.

带回家的消息是:始终将您的单参数构造函数标记为explicit除非您确实希望它们可用于隐式转换.通过"单参数构造函数",我指的是可以使用单个参数调用的构造函数.要么是因为它有一个参数,要么在第一个参数之后有更多和所有参数都有默认参数.

  • 谢谢,这解释了一切. (2认同)

Jar*_*Par 8

任何指针都有一个隐式转换bool.因此,在将指针转换为bool值之后,此代码隐式调用单个参数构造函数

解决此问题的一种方法是使单个参数构造函数显式化.

struct UE{
    explicit UE(bool a = true) {  };
};
Run Code Online (Sandbox Code Playgroud)

除非显式调用构造函数,否则这将阻止编译代码