使用以下宏:
#define ASSERT_IF_TEMP(expr) static_assert(?, "Is temporary!");
我应该为问号添加什么?
答案 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&&