问题描述
这里C()是应该使用no-arg构造函数创建的临时对象,然后我希望调用移动构造函数。然而他们都没有发生。有人可以举例说明为什么吗?
#include <iostream>
using namespace std;
class C{
public:
C(){std::cout<<"No arg\n";}
C(const C& r){std:cout<<"Copy Cons\n";}
C(C&& r){std:cout<<"Move Cons\n";}
};
int main() {
C c(C());
}
解决方法
语句C c(C());
实际上是一个名为c
的函数的函数声明,该函数返回C
并接受一个函数(未命名)作为返回C
的参数,并且不带任何参数。
换句话说,它纯粹是声明性的,对程序没有影响。
这是most vexing parse的示例。
即使我们使用C c((C()))
或C c{C()}
修复了该问题,C ++ 17之前的大多数编译器仍使用该语言授予的权限来优化该“额外”临时对象(并且C ++ 17 they must do so),所以充其量您可能只会看到单个默认构造函数调用的输出。