在C++中定义一个变量,该变量要么是现有值,要么是新值

我可以在不复制对象 b 的情况下使下面的代码工作吗?

#include <iostream>
using namespace std;
class A{
        public:
                A() = default;
                A(const A& a) { cout << "copy ctorn"; }
                A(A&& a) { cout << "move ctorn"; }
                A& operator=(const A& a) { cout << "copyn"; return *this;}
                A& operator=(A&& a) { cout << "moven";  return *this;}
};

A Gen() {
        A x;
        return x;
}

int main() {
        bool cached = true;
        const A b;
        const A& a = cached ? b : Gen();
}

似乎何时cached为真,然后调用复制构造函数。

*编辑:在实际代码中,A类有点大,所以我想避免复制。* 编辑 2:我b保持不变,以澄清意图。

回答

条件运算符的整体类型不是引用类型,因为 'false' 分支不是引用。因此,即使在“真”分支中,b也必须复制对象,以匹配Gen()调用的类型。该赋值引用了该复制的对象。

在您的情况下,您可以通过Gen()将“false”分支中返回的对象简单转换为对该对象的引用来避免此复制操作:

const A& a = cached ? b : static_cast<const A&>(Gen());

请注意,此转换是在您的原始代码中(隐式)由赋值运算符执行的(如果cached是,false它将创建对返回对象的引用)。


以上是在C++中定义一个变量,该变量要么是现有值,要么是新值的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>