2012-06-05 27 views
5

Ví dụ:boost :: call_traits - Tại sao gcc cho sai về điều này?

#include <iostream> 
#include <boost/call_traits.hpp> 
#include <type_traits> 

boost::call_traits<int>::param_type f() 
{ 
     return 1; 
} 

int main() 
{ 
     std::cout << std::boolalpha; 
     std::cout << 
     std::is_const<boost::call_traits<int>::param_type>::value 
     << std::endl; // true 
     std::cout << std::is_const<decltype(f())>::value << std::endl; // false 

} 

Câu hỏi:

Trừ khi, tôi đang làm điều gì sai, tôi nghĩ rằng tôi nên nhận true cho cả hai, nhưng gcc 4.7.0 ra false cho sau này. Có điều gì tôi đang thiếu?

Trả lời

8

Giá trị loại không thuộc loại không bao giờ đủ điều kiện. Chỉ có các loại giá trị hạng loại có thể đủ điều kiện.

Vì vậy, mặc dù chức năng f được khai báo là trả lại một const int, và mặc dù kiểu của hàm fconst int(), khái niệm gọi f() là một rvalue loại (không const) int.

(Trong the new C++11 expression category taxonomy, khái niệm gọi f() là một prvalue loại int Nguyên tắc này cũng áp dụng: ". Prvalues ​​phi lớp luôn có các loại cv-không đủ điều kiện" C++ 11 §3.10/4 tiểu bang đó)

Các vấn đề liên quan