【发布时间】:2018-01-11 14:00:59
【问题描述】:
我有一个有 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))': 未调用原型函数(是否打算定义变量?)",代码如下:
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));
}
【问题讨论】:
-
1 和 2 中的代码 sn-p 完全相同。它必须是
int main()而不是void -
您使用的是 C++11 或更高版本吗?
-
请修复代码“Now if I change to”与之前的代码完全相同的问题
-
对不起,我已经更正了 sn-p 2。是的,我使用的是 C++14。
标签: c++ constructor move-constructor most-vexing-parse