我有4个构造一个类,如下功能:构造解释为函数调用,并移动构造strangly跳过
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));
}
部分问题:https://stackoverflow.com/questions/38951362/most-vexing-parse – NathanOliver
1和2中的代码段完全相同。它必须是'int main()'not'void' – Slava
你使用的是C++ 11还是更高版本? –