2015-03-31 56 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