使用以下宏:
#define ASSERT_IF_TEMP(expr) static_assert(?, "Is temporary!");
问号应该填什么?
首先我们要澄清:“暂时”是什么意思?
当很多人说暂时的时候,他们的意思是不同的。从技术上来说,int()
不是暂时的,但大多数人都会将它们纳入自己对该术语的含义中。从技术上讲,鉴于std::string s;
, then move(s)
也不是临时的,但您可能希望将其与宏视为一个。
我上面提到的第一种“临时变量”实际上是“纯右值表达式”。这些是std::string("foo")
or int()
之类的事情,但不是move(s)
而且(当然)也不是s
之类的事情。这decltype
运算符为我上面谈到的第一种“临时变量”生成非引用类型。对于第二种,move(s)
,它们是x值,它将产生一个右值引用。对于“非临时人员”,即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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)