Mỗi biểu thức trong C++ 11 có một loại giá trị. Một trong các giá trị lvalue, xvalue hoặc prvalue.Thực nghiệm xác định danh mục giá trị của biểu thức C++ 11?
Có cách nào để viết macro, cho bất kỳ biểu thức nào làm đối số, sẽ tạo chuỗi "lvalue", "xvalue" hoặc "prvalue" nếu thích hợp không?
Ví dụ:
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
}
Làm sao VALUE_CAT
được thực hiện?
Điều gì đó dọc theo dòng '#define VALUE_CAT (expr) get_value_description (sizeof SFINAE_test_1 ((expr)), sizeof SFINAE_test_2 ((expr))) ' –
Tôi nghĩ ra điều này nhưng không nghĩ thứ hai là glvalue ... http://ideone.com/ARlW3v –
@BenVoigt Tôi không nghĩ rằng giải pháp dựa trên độ phân giải quá tải có thể hoạt động, vì bộ quá tải không thể phân biệt xvalue với giá trị gia tăng. Nó quá tệ, bởi vì nó có thể có khả năng tránh được một macro hoàn toàn (ví dụ: quá tải các hàm 'constexpr'). (Thực sự tôi rất vui vì không phải như vậy, sẽ làm cho độ phân giải quá tải trở nên phức tạp hơn so với nó đã có!) –