Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当在运行时决定返回类型是右值还是左值时,如何避免不必要的复制?_C++_Design Patterns_Reference - Fatal编程技术网

C++ 当在运行时决定返回类型是右值还是左值时,如何避免不必要的复制?

C++ 当在运行时决定返回类型是右值还是左值时,如何避免不必要的复制?,c++,design-patterns,reference,C++,Design Patterns,Reference,考虑以下几行 const auto x = condition ? getLvalue() : getRvalue(); 因为x是const,我不需要复制getLvalue返回的值,如果我可以引用它,我会很高兴的。当然,以下内容不会编译 const auto& x = condition ? getLvalue() : getRvalue(); // Compilation error 因为引用R值是没有意义的 我该如何解决这个问题?有问题吗?或者我可以信任编译器理解getLvalu

考虑以下几行

const auto x = condition ? getLvalue() : getRvalue();
因为
x
是const,我不需要复制
getLvalue
返回的值,如果我可以引用它,我会很高兴的。当然,以下内容不会编译

const auto& x = condition ? getLvalue() : getRvalue(); // Compilation error
因为引用R值是没有意义的


我该如何解决这个问题?有问题吗?或者我可以信任编译器理解
getLvalue
的返回类型不需要复制吗?

有点接近,但可能是
std::variant

您不能真正使用三元运算符进行赋值,因为它需要
std::common_type
,但对于常规
if…else

(需要C++17) 代码:

我们可以访问变体以打印:

struct visitor
{
    void operator()(int _val)
    {
        std::cout << "rvalue value: " << _val;
    }
    void operator()(std::reference_wrapper<int> _val)
    {
        std::cout << "reference_wrapper value: " << _val << std::endl;
        _val += 1;
    }
};
struct访问者
{
void运算符()(int _val)
{

std::您是否尝试过
const auto&&x=…
?我们称&&为通用参考。可能有点过时,但值得一读,您可以使用
std::move(getLvalue())
@AlexHodges您确定这会有帮助吗?条件表达式的值类别无论如何都是固定的,因此通用引用没有帮助。通用引用将根据其初始化内容变为左值或右值。由于您的引用可以是l或r,因此似乎适合使用universal ref,然后std::转发到需要参考的任何内容。
int& getLValue(){
    static int foo = 42;
    return foo;
}

int getRValue(){
    return 1337;
}
struct visitor
{
    void operator()(int _val)
    {
        std::cout << "rvalue value: " << _val;
    }
    void operator()(std::reference_wrapper<int> _val)
    {
        std::cout << "reference_wrapper value: " << _val << std::endl;
        _val += 1;
    }
};