2016-01-25 31 views
-1

说我有:延长临时一生 - 有道

f(T& t){ ... } 

,我有时想为提供的参数从函数调用

T GetT() { ... } 

这样的:

f(GetT()) 

尽管我确信T的生命周期一直持续到expr结束ssion,我也不能将T&更改为const T&,因为我需要修改f中的对象。
我想过使用T&&但后来当我碰巧有T左值我需要move()它,这将使其尴尬,因为我有时需要调用f后使用T。在我的情况下,T是普通的旧数据,所以我想它会起作用,但移动对象并在之后使用它并不合适。

有没有一种优雅的方法可以让函数将rval和lval引用都变为可变对象?

ATM我只是在做

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

这我觉得至少是一个无用线和T一个无用的副本。

+2

将f(T&t){...}改为f(T t){...}' –

+3

您无法将rvalue绑定到非const左值引用的原因是阻止您修改即将超出范围的对象。 –

+1

@RichardCritten这会造成多余的副本。另外,我无法观察到在T上做出的更改。 – user1316208

回答

-1

您不能将引用绑定到一个temporany:只有const引用可以做到这一点。

我suggesto你看看这个链接C++11 binding rules for const &&

+2

我知道这一点。不知怎的,你错过了这个问题。 – user1316208

+1

@elvis:什么是_reading_ –

1

,你正在做的方式,即存放在变量的对象,是延长返回对象的生命周期,并允许非const有道引用绑定到它。如果执行GetT以便(N)RVO成为可能,则不需要进行无用的副本,因为它可以是elided

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

正确的术语现在是“转发参考”。 – ildjarn

0

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

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

但还是有更好的办法。