2015-03-31 57 views
3

我想做一個函數,檢查參數是否是一個臨時值並返回一個布爾值。查找如果值是一個臨時

讓我們叫它isTemp。例子:

int a; 
isTemp(a); // this should be false; 

isTemp(43); // should be true; 

我在函數中使用模板參數開始,然而這並沒有工作,現在我不知道該怎麼做:

template <typename T> 
bool isTemp(T) { return false; } 

template <typename T> 
bool isTemp(const T) { return true; } 

有什麼建議?

+2

爲什麼你需要做到這一點? – cup 2015-03-31 11:52:22

+0

對於C++ 03,您仍然可以嘗試 – 2015-03-31 13:34:25

回答

6

您可以嘗試使用普遍引用

在C++臨時值通常是由右值(代表所謂的歷史上,因爲右值可能出現在右(在C++ 11引入) ),而其他所有內容都被視爲左值(可以放在賦值運算符的兩側)。

通用引用可表示兩者,這取決於什麼樣的價值傳遞,他們將被迫以左值參考右值引用,可以通過std::is_rvalue_reference確定。

下面是一個例子代碼:

#include <type_traits> 
#include <iostream> 

template <typename T> 
bool isTemp(T&& t) { 
    return std::is_rvalue_reference<T&&>::value; 
} 

int f() { return 0; } 

int main() { 
    int a; 
    std::cout << isTemp(a) << std::endl; // prints 0 
    std::cout << isTemp(f()) << std::endl; // prints 1 
    std::cout << isTemp(43) << std::endl; // prints 1 
} 
+1

這將檢查參數是否爲右值,這與檢查臨時對象是不同的。例如,'f()'是一個右值,但它的返回值不是臨時對象。 (臨時對象必須具有類的類型,請參見[class.temporary])。另一個例子是'isTemp(std :: move(x))',儘管沒有臨時對象,這會給出'1'。 – 2015-03-31 12:41:02

+0

許多rvalue可以出現在賦值運算符的左側(即使在C++ 98中)。您對賦值運算符的評論更多的是歷史的好奇,而不是對術語的定義。 – 2015-03-31 12:47:05

+0

@MattMcNabb:感謝您的提示,我已經從標準中改變了_rvalues_的定義。談到'std :: move'的例子,它看起來像是_xvalues_(eXpiring對象),看起來很像臨時(「通常接近它的生命週期結束時」),並由_ravlues_表示。 – myaut 2015-03-31 13:32:26