为什么没有调用构造函数?

问题描述

这里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),所以充其量您可能只会看到单个默认构造函数调用的输出。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...