查找值是否是临时值

时间:2015-03-31 11:49:16

标签: c++ templates

我试图创建一个函数来检查参数是否是临时值并返回一个布尔值。

让我们称之为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; }

有什么建议吗?

1 个答案:

答案 0 :(得分:6)

您可以尝试使用通用引用(在C ++ 11中引入)

在C ++中,临时值通常由 rvalues 表示(历史上所谓,因为rvalues可能出现在赋值表达式的右侧),而其他所有值都被视为左值(可以放在赋值运算符的两边)。

通用引用可以表示两者,并且取决于它们将强制传递给左值引用右值引用的值,这可以由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
}