tipos significado que programacion ejemplos definicion declaracion datos c++ c++11

significado - ¿Determinar empíricamente la categoría de valor de la expresión de C++ 11?



tipos de datos en c++ (2)

Cada expresión en C ++ 11 tiene una categoría de valor. Uno de lvalue, xvalue o prvalue.

¿Hay alguna manera de escribir una macro que, dada cualquier expresión como argumento, produzca una cadena "lvalue", "xvalue" o "prvalue" según corresponda?

Por ejemplo:

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 }

¿Cómo se podría implementar VALUE_CAT ?


También podría intentar usar la función de Classification la API clang para devolver la categoría de la expresión de un AST clang que contenga la expresión. Esto es, por supuesto, mucho más complejo que la solución de @ Luc, ya que requiere generar el AST real a través del clang.


decltype puede devolver el tipo declarado de una entidad (de ahí el nombre), pero también se puede usar para consultar el tipo de una expresión. Sin embargo, en este último caso, el tipo resultante se ''ajusta'' de acuerdo con la categoría de valor de esa expresión: una expresión lvalue da como resultado un tipo de referencia lvalue, un valor x en un tipo de referencia rvalue y un valor prvaluado solo en el tipo. Podemos usar esto para nuestro beneficio:

template<typename T> struct value_category { // Or can be an integral or enum value static constexpr auto value = "prvalue"; }; template<typename T> struct value_category<T&> { static constexpr auto value = "lvalue"; }; template<typename T> struct value_category<T&&> { static constexpr auto value = "xvalue"; }; // Double parens for ensuring we inspect an expression, // not an entity #define VALUE_CATEGORY(expr) value_category<decltype((expr))>::value