强制转换为右值引用可防止复制省略

问题描述 投票:0回答:1

我阅读了更多相关文章,但没有一个答案能够澄清我的疑虑。为什么在下面的代码中,仅当没有转换为右值引用时才会进行优化,否则会调用移动(无论是否提供)或复制(如果没有提供移动构造函数)构造函数。

struct Clasa{
    Clasa(){
        std::cout << "Default" << std::endl;
    }
    Clasa(const Clasa& clasa){
        std::cout << "Copy" << std::endl;
    }
    Clasa(Clasa&& clasa){
        std::cout << "Move" << std::endl;
    }
    ~Clasa(){
        std::cout << "Destructor" << std::endl;
    }
};

int main(){
    Clasa c = (Clasa&&)Clasa();//no optimization
    Clasa d = Clasa();//move/copy elision
} 
c++ rvalue-reference move-constructor copy-elision
1个回答
0
投票

在第一种情况下,当您显式地将引用绑定到纯右值时,会发生

Clasa c = (Clasa&&)Clasa();
临时物化,因此不会出现省略。这一点从临时物化就可以看出:

暂时实体化发生在以下情况:

  • 将引用绑定到纯右值时;

现在来看

Clasa d = Clasa();
的第二种情况,从C++17开始有强制复制省略

但在 C++17 之前,这可能会导致使用

d
复制初始化 创建临时对象。 这里有更详细的解释。

© www.soinside.com 2019 - 2024. All rights reserved.