2012-06-05 22 views
5

Przykład:doładowanie :: call_traits - Dlaczego gcc podaje w tym celu wartość false?

#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 

} 

pytanie:

Chyba robię coś źle, myślę, że powinno być coraz true dla obu, ale gcc 4.7.0 Wyjścia false dla tych drugich. Czy jest coś, czego mi brakuje?

Odpowiedz

8

Rwartość typu innego niż klasa nigdy nie jest stała. Jedynie wartości rytmu klasy mogą być konstytucyjne.

Więc, mimo że funkcja f jest zadeklarowana jako przekazujących const int i chociaż rodzaj funkcji f jest const int() wyrażenie wezwanie f() jest rvalue typu (const) int.

(W the new C++11 expression category taxonomy wyrażenie wezwanie f() jest prvalue typu int Ta sama zasada ma zastosowanie. "Prvalues ​​non-klasy zawsze rodzaje CV-niewykwalifikowany" C++ 11 §3.10/4 stanowi, że)

Powiązane problemy