首页 > 解决方案 > 为什么不调用构造函数?

问题描述

这里 C() 是一个临时对象,应该使用无参数构造函数创建,然后我期望调用移动构造函数。然而它们都没有发生。有人可以解释为什么吗?

#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++constructormove-constructortemporary-objects

解决方案


该语句C c(C());实际上是一个被调用函数的函数声明,该函数c返回C并接受一个函数(未命名)作为参数,该函数返回 aC并且不接受任何参数。

换句话说,它纯粹是声明性的,对程序没有影响。

这是最令人头疼的解析示例。

即使我们修复了 (with C c((C()))or C c{C()}) ,C++17 之前的大多数编译器都使用语言授予的权限来优化“额外”临时对象(从 C++17 开始,他们必须这样做),所以充其量您可能只会看到单个默认构造函数调用的输出。


推荐阅读