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;
}
};