Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找值是否为临时值_C++_Templates - Fatal编程技术网

C++ 查找值是否为临时值

C++ 查找值是否为临时值,c++,templates,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 is

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

我们称之为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; }
模板
boolistemp(T){返回false;}
模板
bool isTemp(const T){return true;}
有什么建议吗?

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

<> P> C++中的临时值通常由RVales表示(因此,历史上,因为Ro值可以出现在赋值表达式的右侧),而其他所有的值都被视为LValk(可以放到赋值操作符的两边)。p> 通用引用可以同时表示这两种引用,根据传递的值,它们将被强制为左值引用或右值引用,这可以由
std::is\u rvalue\u 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
}
#包括
#包括
模板
布尔isTemp(T&T){
返回std::is\ rvalue\ u reference::value;
}
int f(){return 0;}
int main(){
INTA;

std::cout为什么需要这样做?对于C++03,您仍然可以尝试使用此检查参数是否为右值,这与检查临时对象不同。例如,
f()
是右值,但其返回值不是临时对象。(临时对象必须具有类类型,请参阅[class.temporary])。另一个例子是
isTemp(std::move(x))
,这将给出
1
,尽管没有临时值。许多右值可以出现在赋值运算符的左侧(即使在C++98中)。您关于赋值运算符的评论更像是一个历史性的稀奇,而不是术语的定义。@MattMcNabb:谢谢您的说明,我已经将右值的定义改为标准值。说到,
std::move
example,它们似乎算作xvalues(过期对象),看起来很像临时对象(“通常在其寿命结束时”)并以蹂躏为代表。