class Foo
{
public:
explicit Foo() {}
explicit Foo(Foo&) {}
};
Foo d = Foo();
错误:没有匹配的函数可用于调用“Foo::Foo(Foo)”
我尝试改变Foo(Foo&)
to Foo(Foo)
正如错误所示,据我所知,这不是一个有效的构造函数,果然我得到了:
错误:构造函数无效;你的意思可能是“Foo (const Foo&)”
是什么赋予了?我该如何解决这个问题? (顺便说一句,这是在 GCC 上)
复制构造函数中有两个有问题的东西。
首先,您已经明确了复制构造函数(这是一件值得怀疑的事情),所以您(理论上)需要这样做:
Foo d( (Foo()) );
其次,您的复制构造函数采用引用而不是const
参考,这意味着您不能将其与临时对象一起使用Foo
.
就我个人而言,我只是删除explicit
从复制构造函数并使其采取const
可以的话参考一下。
请注意,explicit
对你的默认构造函数没有影响。[*]explicit
仅对可以使用单个参数调用的构造函数有效。它防止它们被用于隐式转换。对于仅采用零个或仅两个或更多参数的构造函数,它没有任何效果。
[注意:以下之间可能存在差异:
Foo d;
and
Foo d = Foo();
但在这种情况下,您有一个用户声明的默认构造函数,因此这不适用。]
Edit:[*] 我刚刚仔细检查过这一点,12.3.1 [class.conv.ctor] 说你可以创建一个默认构造函数explicit
。在这种情况下,构造函数将用于执行默认初始化 or 值初始化。老实说,我不明白 this 的值,因为如果你有一个用户声明的构造函数,那么它是一个非 POD 类型,甚至非 POD 类型的本地对象如果没有初始化程序,也会默认初始化该条款说可以通过explicit
默认构造函数。也许有人可以指出一个极端的情况,它确实会产生影响,但现在我不知道有什么影响explicit
有一个默认构造函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)