2
#include <iostream>

class studant {
    public:
    studant () {
        std::cout<<"studant"<<std::endl;
    }
    studant(const  studant& a) {
        std::cout<<"copy studant (&)"<<std::endl;
    }
   studant(studant&& a) {
        std::cout<<"move studant (&)"<<std::endl;
    }
    studant maximum () {
        studant c1;
        return c1;
    }
};
studant create () {
     studant c1;
    return c1;
}
int main()
{
    studant c2;
    studant c3=c2.maximum ();
    studant c4=create ();
}

请看上面的代码为什么“studant c3=c2.maximum()”和“studant c4=create()”没有调用复制或移动构造函数。请解释一下。

4

1 回答 1

1

这是因为 RVO(返回值优化)。studant c3=c2.maximum ()调用maximum(),编译器知道c1里面maximum()会被返回然后赋值给c3,然后c1会被丢弃。编译器足够聪明,可以只创建一个实例studant来避免赋值。这意味着c1insidemaximum()c3.

这对于“c4”和c1函数“create()”是一样的。

于 2020-05-02T09:04:56.673 回答