使用`(boost :: any a)`而不是`(const boost :: any& a)`来防止引用引用

时间:2012-05-31 18:34:13

标签: c++ boost stl boost-any

  

首先是我们的新函数对象contains_t的定义。它   可以继承自助手类std :: unary_function(部分   C ++标准库的目的是为了便于创建   正确的typedef)并定义了参数和结果类型   自动,但为了清楚,所需的typedef是   明确提供。 参数类型已从const更改   提高::任何和放大器;提升::任何,以避免潜力   引用引用,这是非法的。实现只是   和以前一样,只有它放在函数调用操作符中。

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();
  }
};

谢谢

1 个答案:

答案 0 :(得分:1)

由于boost :: any可以存储任何内容,因此它也可以存储引用。因此,如果你有一个boost :: any的引用,你可能会意外地在内部引用一个引用。

即。 boost :: any可以表示任何类型T.令T是U类型的引用,即T = U&amp ;.因此,对类型T的引用会创建对类型U的引用的引用,这在C ++ 03中是不允许的(C ++ 11将允许它)。