如何测试表达式是否是临时的?

时间:2011-05-24 08:50:30

标签: c++ c++11 static-assert

使用以下宏:

#define ASSERT_IF_TEMP(expr) static_assert(?, "Is temporary!");

我应该为问号添加什么?

2 个答案:

答案 0 :(得分:9)

首先我们应该澄清一下:“临时”是什么意思?

当他们说临时时,许多人的意思不同。从技术上讲,int()不是暂时的,但大多数人会将它们纳入自己对该术语的含义。从技术上讲,给定std::string s;move(s)也不是临时的,但您可能希望将其视为宏。

我上面提到的第一种“临时表演”实际上是“prvalue表达”。这些是std::string("foo")int()类似的东西,但不是move(s),也不是(肯定)不是s类的东西。 decltype运算符为我上面讨论过的第一种“临时”产生了非引用类型。对于第二种类型move(s),它们是xvalues,它将产生右值引用。对于“非临时”,即s个案,它将产生一个左值参考。

总而言之,我将定义三个精确的宏,您可以从中进行选择

#define IS_LVALUE(...) std::is_lvalue_reference<decltype((__VA_ARGS__))>::value
#define IS_XVALUE(...) std::is_rvalue_reference<decltype((__VA_ARGS__))>::value
#define IS_PRVALUE(...) !std::is_reference<decltype((__VA_ARGS__))>::value

答案 1 :(得分:5)

修改

我意识到我的方法与你说的代码完全不同,只是逻辑上颠倒了:

std::is_lvalue_reference<decltype((expr))>::value

你能否详细说明它在什么样的情况下会违背你的期望呢?


您可以像这样利用参考折叠规则:

std::is_rvalue_reference<decltype((expr))&&>::value

如果expr是某些(可能是const)类型T的左值,则decltype((expr))将解析为T&,而T& &&将折叠回{ {1}}。

否则,如果T&是某种类型expr的x值,则T将为decltype((expr))T&&将减少为T&& && }。

否则,T&&将是expr某种类型的prvalue,T会产生decltype((expr)),因此整个类型将为T。< / p>

示例:

T&&