используйте `(boost::any a)` вместо `(const boost::any& a)`, чтобы предотвратить ссылку на ссылку

Сначала идет определение нашего нового функционального объекта, contains_t. Он мог бы быть унаследован от вспомогательного класса std::unary_function (часть стандартной библиотеки C++, предназначенной для облегчения создания правильных определений типов) и иметь автоматически определяемые типы аргументов и результатов, но, чтобы все было ясно, требуемые определения типов предоставляется явно. Тип аргумента изменен с const boost::any& на boost::any, чтобы избежать потенциальной ссылки на ссылку, что является незаконным. Реализация такая же, как и раньше, только здесь она размещена в операторе вызова функции.

template <typename T> struct contains_t {
  typedef boost::any argument_type;
  typedef bool result_type;
  bool operator()(boost::any a) const {
    return typeid(T)==a.type();
  }
};

Почему следующая реализация может получить ссылку на ссылку?

template <typename T> struct contains_t {
  typedef boost::any argument_type;
  typedef bool result_type;
  bool operator()(const boost::any& a) const {
    return typeid(T)==a.type();
  }
};

Спасибо


person q0987    schedule 31.05.2012    source источник
comment
Из чего эта блок-цитата?   -  person Nicol Bolas    schedule 31.05.2012
comment
amazon.com/Beyond-Standard-Library-Introduction-Boost/ дп/   -  person q0987    schedule 31.05.2012


Ответы (1)


Поскольку boost::any может хранить что угодно, он также может хранить ссылки. Поэтому, если у вас есть ссылка на boost::any, вы можете случайно получить ссылку на внутреннюю ссылку.

т. е. boost::any может представлять любой тип T. Пусть T будет ссылкой типа U, т. е. T = U&. Таким образом, получение ссылки типа T создает ссылку на ссылку типа U, что не разрешено в C++03 (хотя C++11 это позволит).

person bstamour    schedule 31.05.2012