【发布时间】:2013-05-19 18:19:08
【问题描述】:
C++11 中的每个表达式都有一个值类别。 lvalue、xvalue 或 prvalue 之一。
有没有办法编写一个宏,给定任何表达式作为参数,将产生一个字符串“lvalue”、“xvalue”或“prvalue”?
例如:
int main()
{
int x;
cout << VALUE_CAT(x) << endl; // prints lvalue
cout << VALUE_CAT(move(x)) << endl; // prints xvalue
cout << VALUE_CAT(42) << endl; // prints prvalue
}
VALUE_CAT 怎么实现?
【问题讨论】:
-
类似于
#define VALUE_CAT(expr) get_value_description(sizeof SFINAE_test_1((expr)), sizeof SFINAE_test_2((expr))) -
我想出了这个,但它不认为第二个是glvalue...ideone.com/ARlW3v
-
@BenVoigt 我不认为基于重载解决方案的解决方案可以工作,因为重载集无法区分 xvalue 和 prvalue。这太糟糕了,因为可能完全避免使用宏(例如,
constexpr函数的重载集)。 (实际上我很高兴事实并非如此,这会使重载解析比现在更加复杂!)