簡體   English   中英

R ++中的Rvalues 03

[英]Rvalues in C++03

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

或者我有一種非常令人作嘔的感覺,這就是為什么右值引用在C ++ 0x中?

編輯:

is_rvalue =!(is_reference || is_pointer)?

顯然有一種方法可以確定表達式是否是C ++ 03中的右值或左值(我說顯然是因為我不確定我對該技術的理解程度如何)。 請注意,為了使該技術可用,非常需要預處理器宏。 Eric Niebler撰寫了一篇很好的文章,介紹它是如何工作的以及如何在BOOST_FOREACH中使用它:

請注意,這篇文章非常重讀(至少對我而言); 正如Neibler所說:

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

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

如何判斷給定參數是否是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不會為你削減它。

或者我有一種非常令人作嘔的感覺,這就是為什么右值引用在C ++ 0x中?

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

我能想到的最接近的事情是通過const-reference取一些東西,因為它可以綁定到左值或右值(如果右值需要構造一個臨時值)。 也就是說,您的代碼將無法區分這兩者。

或者我有一種非常令人作嘔的感覺,這就是為什么右值引用在C ++ 0x中?

對。 這正是他們被添加到C ++ 0x的原因。 您無法在C ++中創建重載來區分rvalues和lvalues。

這不會做你想要的嗎?

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

注意...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM