2010-06-11 78 views
4

如何判斷給定的參數是否是C++ 03中的右值?我正在寫一些非常通用的代碼,並且如果可能的話需要參考,否則就構建一個新的對象。我可以通過重載以及通過引用來重載,並讓右值返回調用by-value函數嗎?C++中的Rvalues 03

還是我有一個非常令人作嘔的感覺,這就是爲什麼右值引用是在C++ 0x?

編輯:

is_rvalue =(is_reference || is_pointer)!?

回答

5

顯然有一種方法可以確定在C++ 03中表達式是右值還是左值(我之所以說顯然是因爲我不確定我是否理解該技術)。請注意,要使該技術可用,預處理器宏幾乎是必需的。埃裏克Niebler已經撰寫了有關它如何工作的一個很好的文章,它被如何使用BOOST_FOREACH:

請注意,文章是相當沉重的讀數(至少對我來說);就像Neibler說的那樣:

毫無疑問,這是神祕的東西,但是我們得到了一個強大的方法來檢測任何表達式的右值和左值。

使用artcile中描述的右值檢測可能會幫助您處理至少一些C++ 0x的右值引用解決的問題。

+1

[這裏](http://www.artima.com/cppsource/foreach3.html)是文章的相關頁面。有趣的東西。 – academicRobot 2010-06-11 19:36:22

+0

@academicRobot:我不相信我忘了實際鏈接到文章。鏈接現在在那裏(正如你所說,右值檢測的東西在第3頁)。 – 2010-06-11 19:40:14

+0

+1,這是一個很棒的技術,但是它在* run-time *處進行檢查。我試圖擴展這個在*編譯時查找表達式是否是左值還是不是。我問過一個[關於這個問題](http://stackoverflow.com/questions/9084671/c03-test-for-rvalue-vs-lvalue-at-compile-time-not-just-at-runtime)。 – 2012-01-31 18:10:32

1

還是我有一個非常令人作嘔的感覺,這就是爲什麼右值引用是在C++ 0x?

你是對的,你需要C++ 0x和右值引用來做到這一點。

我能想到的最接近的東西是通過const引用來取得某些東西,因爲它可以綁定到左值或右值(如果右值需要構造臨時值)。也就是說,你的代碼將無法區分這兩者。

1

還是我有一個非常令人作嘔的感覺,這就是爲什麼右值引用是在C++ 0x?

是。這正是他們被添加到C++ 0x的原因。 您不能在C++中創建重載以區分右值和左值。

2

如何判斷給定的參數是否是C++ 03中的右值?

你不行。所有你能做的就是相信你的客戶和欺騙:

void call_me_with_anything(const T& const_ref) 
{ 
    /* read from const_ref */ 
} 

void call_me_with_rvalue_only_please_i_trust_you(const T& const_ref) 
{ 
    T& ref = const_cast<T&>(const_ref); 
    /* write through ref */ 
} 

我正在寫一些很通用的代碼

話,只怕C++ 03將不會削減它適合你。

+0

既然你是虛擲常量,那應該是左值的唯一。如果它只適用於左值,則應該使參數成爲非const參考。 – 2010-06-11 19:38:51

+0

你在說什麼?這個令人討厭的角色的全部重點是修改右值。 – fredoverflow 2010-06-11 20:23:47

1

我在寫一些非常通用的代碼,如果可能的話需要引用,否則就構造一個新的對象。

這不是你想做的嗎?

void f(T& t); 
void f(T const& t); 

注意...

T t; f(t); // calls f(T&) 
f(T()); // calls f(T const&)