gpt4 book ai didi

c++ - Foo f = Foo();//没有调用 'Foo::Foo(Foo)' 的匹配函数……嗯?

转载 作者:可可西里 更新时间:2023-11-01 14:53:48 27 4
gpt4 key购买 nike

class Foo
{
public:
explicit Foo() {}
explicit Foo(Foo&) {}
};

Foo d = Foo();

error: no matching function for call to 'Foo::Foo(Foo)'

我尝试按照错误提示将 Foo(Foo&) 更改为 Foo(Foo),这 AFAIK 不是有效的构造函数,果然我得到了:

error: invalid constructor; you probably meant ‘Foo (const Foo&)’

什么给了?我该如何解决这个问题? (顺便说一句,这是在 GCC 上)

最佳答案

您的复制构造函数中有两个可疑的东西。

首先,您已将复制构造函数显式化(这是一件有问题的事情),因此您(理论上)需要这样做:

Foo d( (Foo()) );

其次,您的复制构造函数采用引用而不是 const 引用,这意味着您不能将它与临时 Foo 一起使用。

就我个人而言,我只是从复制构造函数中删除 explicit 并尽可能使用 const 引用。

请注意,默认构造函数上的 explicit 无效。[*] explicit 仅对可以使用单个参数调用的构造函数有影响。它防止它们被用于隐式转换。对于只接受零个或两个或更多参数的构造函数,它没有任何效果。

[注意:两者之间可能存在差异:

Foo d;

Foo d = Foo();

但在这种情况下,您有一个用户声明的默认构造函数,因此这不适用。]

编辑:[*] 我刚刚仔细检查过这个,12.3.1 [class.conv.ctor] 说你可以创建一个默认构造函数 explicit。在这种情况下,构造函数将用于执行默认初始化值初始化。老实说,我不明白它的值(value),就好像你有一个用户声明的构造函数那么它是一个非 POD 类型,甚至非 POD 类型的本地对象如果没有初始化器也会被默认初始化该子句表示可以通过 explicit 默认构造函数完成。也许有人可以指出它确实有所作为的极端情况,但目前我看不到 explicit 对默认构造函数有什么影响。

关于c++ - Foo f = Foo();//没有调用 'Foo::Foo(Foo)' 的匹配函数……嗯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2776313/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com