2011-06-02 7 views
8

estoy trabajando a través "C++ Template Metaprogramming" by Abrahams & Gurtovoy " Esto no es en realidad en el capítulo dos, pero es algo que he intentado mientras trabajaba en el primer ejercicio (2.10, 2.0) que me está confundiendo:¿Por qué boost :: is_same <int const &, boost :: add_const <int &> :: value es igual a false?

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

std::string display(bool b) 
{ 
    return (b ? "true" : "false"); 
} 

int main() 
{ 
    using namespace std; 

    cout << display(boost::is_same<int const&, boost::add_const<int &>::type >::value) << "\n"; 

    return 0; 
} 

La salida es" falsa'. sin embargo si quito las referencias, es decir, 'const int' y 'int'. La salida es 'verdadero'.

+3

BTW Puede evitar su función 'display' configurando' std :: cout << std :: boolalpha; ' – juanchopanza

Respuesta

11

Si ha intentado lo mismo con los punteros, como en

boost::is_same<int const *, boost::add_const<int *>::type>::value 

que le descubre que también es falso, ya que genera boost::add_const<int *>::typeint *const tipo, que obviamente no es lo mismo que int const *.

Esencialmente sucede lo mismo con las referencias, es decir, boost::add_const<int &>::type es un intento de generar int &const. Formalmente, el tipo int &const es ilegal en C++. La calificación de cv no se puede aplicar a la referencia en sí. Por lo tanto, boost::add_const está diseñado para ser operativo en este caso, lo que significa que boost::add_const<int &>::type genera int & nuevamente.

+0

Lo entiendo ahora. Supuse que add_const me daría int const pero trata de agregar la const * del otro lado *, gracias –

9

no se puede agregar const a una referencia, sería int& const que no es posible.

Al igual que con un typedef, sumando q ualifiers no es un reemplazo de texto, sino algo que funciona en todo el tipo.

+0

La implicación es (en caso de que no fuera claro) que' boost :: add_const :: type 'sigue siendo solo' int & '. – ildjarn

+0

Como se ilustra en los ejemplos de la documentación oficial: http://www.boost.org/doc/libs/1_46_1/libs/type_traits/doc/html/boost_typetraits/reference/add_const.html –

+0

Y de hecho 'int & const' es ilegal. Si se permitiera, sería superfluo porque una referencia ya está implícitamente establecida. –

Cuestiones relacionadas