2016-01-25 29 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); }

但還是有更好的辦法。