gpt4 book ai didi

c++ - 构造函数被解释为函数调用,并且 move constructors strangly skipped

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:23 26 4
gpt4 key购买 nike

我有一个包含 4 个构造函数的类和一个如下所示的函数:

using namespace std;

class ABC {
public:
ABC() {
cout << "ABC()\n";
}

ABC(int) {
cout << "ABC(int)\n";
}

ABC(ABC&) {
cout << "ABC(&)\n";
}

ABC(ABC&&) {
cout << "ABC(&&)\n";
}
};


void ff(ABC t) { }

请帮我解释一些我觉得很奇怪的行为(我使用MSVC 2016编译):

1) 为什么我收到警告 C4930:“'ABC a1(ABC (__cdecl *)(void))': 未调用原型(prototype)函数(是否为变量定义?)”,代码如下:

void main() {
ABC a1(ABC());
ff(ABC(5));
}

在执行时,我希望得到以下输出:

ABC()
ABC(&&)
ABC(int)
ABC(&&)

但我真正得到的是

ABC(int)

2) 现在如果我改成

void main() {
ABC a1(ABC(5));
ff(ABC(5));
}

没有更多的警告。但是在执行时,我期望得到的是

ABC(int)
ABC(&&)
ABC(int)
ABC(&&)

但我真正得到的是

ABC(int)
ABC(int)

3)现在

void main() {
ABC( ABC() );
ff(ABC(5));
}

它甚至无法编译。我收到错误 C2660:“‘ABC’:函数不接受 1 个参数”。

4) 最后,为什么下面的代码可以编译而 3) 不能?

void main() {
ff(ABC(5));
}

最佳答案

由于称为 most vexing parse in C++ 的问题, 线

ABC a1(ABC());

a1 声明为返回类型为 ABC 且参数类型为不带参数并返回 ABC 的函数。


线

ABC(ABC());

更难剖析,但它也是函数的声明,而不是变量的定义。

int(a);

是变量 a 的有效声明。它与以下内容相同:

int a;

类似地,带有ABC的行与:

ABC ABC();

这里 ABC 有重载的意思。第一个 ABC 是类型名称。第二个 ABC 是函数名(由于最麻烦的解析)。它将 ABC 声明为一个不带参数并返回类型为 ABC 的对象的函数。对于函数的其余部分,ABC 是函数名,而不是类型名。因此,

ff(ABC(5));

是无效的,因为在该上下文中 ABC 是一个不带参数的函数。


对于为什么不调用移动构造函数的问题,我没有答案。

关于c++ - 构造函数被解释为函数调用,并且 move constructors strangly skipped,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45493108/

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