2

首先是我们的新函数对象 contains_t 的定义。它可能继承自辅助类 std::unary_function(C++ 标准库的一部分,旨在促进正确的 typedef 的创建)并自动定义参数和结果类型,但为了清楚起见,所需的 typedef 是明确提供。参数类型已从 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();
  }
};

谢谢

4

1 回答 1

2

由于 boost::any 可以存储任何东西,它也可以存储引用。因此,如果您有对 boost::any 的引用,您可能会意外地在内部得到对引用的引用。

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

于 2012-05-31T19:51:47.290 回答