根据经验确定C ++ 11表达式的值类别?

时间:2013-05-19 18:19:09

标签: c++ c++11

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

2 个答案:

答案 0 :(得分:41)

decltype可以返回实体的声明类型(因此名称),但也可以用于查询表达式的类型。但是,在后一种情况下,根据该表达式的值类别对结果类型进行“调整”:左值表达式导致左值引用类型,右值引用类型中的xvalue和仅类型中的prvalue。我们可以将此用于我们的利益:

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

答案 1 :(得分:1)

您还可以尝试使用clang API的Classification函数从包含表达式的clang AST返回表达式的类别。当然,这比@Luc的解决方案复杂得多,因为它需要通过clang生成实际的AST。