繁体   English   中英

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

[英]Why can I assign struct with a pointer?

为什么甚至编译?

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除非您确实希望它们可用于隐式转换。 通过“单参数构造函数”,我指的是可以使用单个参数调用的构造函数。 要么是因为它有一个参数,要么在第一个参数之后有更多和所有参数都有默认参数。

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

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

struct UE{
    explicit UE(bool a = true) {  };
};

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

任何标量类型都可以转换为布尔值true或false,具体取决于它的值是否等于零。

在这个声明中

ue = new UE(true); 

由编译器复制赋值运算符隐式定义的函数被调用。 由于表达式新UE(true)不等于零,因此可以将其隐式转换为布尔值true。 UE类具有转换构造函数

UE(bool a = true);

将bool类型的对象转换为UE类型的对象。

要防止这种用法,您应该将构造函数定义为显式

explicit UE(bool a = true);

如果你将构造函数标记为显式,那么这将不起作用:

explicit UE( bool a = true) {  };

这是因为从指针到bool的隐式转换,我们可以看到这是允许从草案C ++标准部分4.12 布尔转换说( 强调我的 ):

算术,无范围枚举, 指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM