2012-06-05 26 views
5

Esempio:boost :: call_traits - Perché gcc sta dando false per questo?

#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 

} 

Domanda:

meno, sto facendo qualcosa di sbagliato, penso che dovrei ottenere true per entrambi, ma gcc 4.7.0 uscite false per il secondo. C'è qualcosa che mi manca?

risposta

8

Un valore di tipo non di classe non è mai const-qualificato. Solo i rvalues ​​di tipo classe possono essere qualificati.

Quindi, anche se la funzione f è dichiarata come restituzione di un const int, e anche se il tipo della funzione f è const int(), l'espressione chiamata f() è un rvalue di tipo (non-const) int.

(In the new C++11 expression category taxonomy, l'espressione chiamata f() è un prvalue di tipo int La stessa regola vale:. "Prvalues ​​non classe hanno sempre tipi cv-qualificato" C++ 11 §3.10/4 stabilisce che)

Problemi correlati