2012-06-05 15 views
5

Ejemplo:boost :: call_traits - ¿Por qué gcc da falso para esto?

#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 

} 

pregunta:

A menos, que estoy haciendo algo mal, creo que debería llegar a true para ambos, pero gcc 4.7.0 salidas false para el segundo. ¿Hay algo que este olvidando?

Respuesta

8

Un valor r no de clase nunca es const-qualified. Solo los valores de clase pueden ser calificados.

Así, a pesar de que la función f se declara como el retorno de una const int, ya pesar de que el tipo de la función f es const int(), la expresión llamada f() es un valor p de tipo (no constante) int.

(En the new C++11 expression category taxonomy, la expresión llamada f() es un prvalue de tipo int aplica la misma regla: ". Prvalues ​​no clase siempre tienen tipos CV-no cualificado" C++ 11 §3.10/4 estados que)

Cuestiones relacionadas