延长临时的使用寿命 - 正确的方式

时间:2016-01-25 10:45:15

标签: c++

说我有:

f(T& t){ ... }  

我有时想从函数调用中提供参数

T GetT() { ... }  
像这样:

f(GetT())  

即使我确信T的生命周期保证会持续到表达结束,但我也无法将T&更改为const T&,因此无法编译我需要修改f内的对象 我考虑过使用T&&但是当我碰巧有T左值时,我需要move()它,这会让它变得尴尬,因为我有时需要使用T致电f之后。在我的情况下,T是普通的旧数据,所以我想它会起作用但是移动对象并在之后使用它感觉不对。

是否有一种优雅的方法允许函数将rval和lval引用为可变对象?

ATM我正在做

T t = GetT();  
f(t);

我觉得至少有一条无用的行和T的无用副本。

4 个答案:

答案 0 :(得分:1)

您当前正在进行的操作,即将对象存储在变量中,是延长返回对象生命周期并允许非const引用绑定到它的正确方法。如果GetT被实现以便可以(N)RVO,则不需要进行无用的复制,因为它可以是elided

答案 1 :(得分:1)

如何使用universal references

不确定你是否会认为它很优雅,但它看起来像这样:

struct MyStruct
{
    int i;
};

template<class T>
void foo(T&& t)
{
    static_assert(std::is_base_of<MyStruct, 
                  typename std::remove_reference<T>::type>::value, "ERROR");
    t.i = 1024;
}

MyStruct GetMyStruct()
{
    return MyStruct();
}

int main() 
{
    foo(GetMyStruct());

    MyStruct ms;
    foo(ms);

    return 0;
}

答案 2 :(得分:0)

我想出了一个简单过载问题的解决方案:

f(T&amp; t){...}
f(T&amp; t){f(t); }

但仍需要更好的方法。

答案 3 :(得分:-1)

你不能绑定对temporany的引用:只有const引用才能这样做。

我建议您查看此链接C++11 binding rules for const &&