Почему boost :: is_same:: значение равно ложному? - PullRequest
8 голосов
/ 02 июня 2011

Я работаю через "Метапрограммирование шаблона C ++" Абрахамса и Гуртовой" На самом деле это не во второй главе, но я попробовал это во время работы над первым упражнением (2.10, 2.0), что меня смущает:

#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;
}

Вывод «ложь». Однако, если я удалю ссылки, то есть 'int const' и 'int'. Выход «true».

Ответы [ 2 ]

11 голосов
/ 02 июня 2011

Если вы пробовали то же самое с указателями, как в

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

вы обнаружите, что это также ложь, поскольку boost::add_const<int *>::type генерирует тип int *const, который явно не совпадает с int const *.

По существу, то же самое происходит со ссылками, то есть boost::add_const<int &>::type - это попытка сгенерировать int &const. Формально тип int &const недопустим в C ++ - квалификация cv не может быть применена к самой ссылке. Таким образом, boost::add_const в этом случае предназначен для запрета, а это означает, что boost::add_const<int &>::type снова генерирует int &.

9 голосов
/ 02 июня 2011

Вы не можете добавить const к ссылке, это будет int& const, что невозможно.

Как и в случае определения типа, добавление квалификаторов - это не замена текста, а то, что работает для всего типа.

...