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

让我们称之为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楼 票数:6 已采纳

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

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

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

  ask by kir translate from so

未解决问题?本站智能推荐:

3回复

销毁的返回值是否会有临时值?

我对有关复制删除的新规则有些困惑,实际上我甚至不确定它是否适用于这种情况。 我有这个: 其中make_foo仅允许推导参数(在实际代码中t是lambda,但是为了简单起见,或者为了混淆起见,在此省略了该参数),如下所示: 现在,我需要绝对确定foo的析构函数只被调用一次: x超出范围时
3回复

C++模板类型扣除临时值

嗨,我有一个问题,为什么最后一个语句给出编译器错误。 :18:10:错误:无法将类型为'A&'的非const左值引用绑定到类型'A'包装器(A())的右值; 我认为模板类型T将被推导为const A&因为ca也被推导为const A& 。 在这种情况下,为什么类型扣除
1回复

为什么对常量临时值的本地引用似乎比它定义的方法更有效?

我很困惑为什么以下代码成功编译并且似乎通过显示 7 两次来正确运行。 我怀疑在两次调用中都潜伏着一些未定义的行为。 在本例中,两个局部引用变量分别指向临时值 3 和 7。 然后该方法返回对最大值的引用,即 7。但是,当该方法返回时,该引用不再有效。 它悬着! 所以,即使 var1 似乎指的是 7 的
4回复

模板中的C++右值临时

您能否解释一下以下机制之间的区别: 关于实例化,我的推理正确吗? 为什么不首先实例化为const T& ? 谢谢
1回复

C++函数从列表中查找最小值。此函数是否正确,因为返回的迭代器无效

在main()中 .. .. 前三个cout打印0x600d88,最后一个cout打印0x600d08,谁能解释我的原因? ,,
1回复

根据运行时值取模板

我有一个enum : 有一个函数,它有一个运行时参数。 在该函数内部,有一个基于运行时参数的模板函数调用。 重要提示:我不能将operation_do()作为模板函数。 这是条件。 我有一个编译错误: op不是常量表达式。 我尝试使用帮助功能解决此问题,如下所示: 但它仍然是同样的错误: op不是一
1回复

只要引用不超过对象,存储对(可能)临时对象的引用是否合法?

在阅读了std::variant和方便的overloaded技巧之后,我给自己设定了一个挑战(一个练习)来编写一个帮助我编写的帮助程序 代替 我也希望它在其他情况下工作,比如 你明白了。 这是我想出的(请注意,我已将名称从overloaded更改为Visitor : 问题是:在Helper存储引用是
2回复

为什么不能使用左值构造函数自变量创建此模板化类的临时类?

对于我的一生,我似乎无法创建这个类的临时对象,为什么它不允许我这样做? 另外,这里有什么区别,再次在右值和左值之间: 还: 我接受是因为这是聚合初始化?