使用const& C ++的C ++模板函数包装器参数与&

时间:2012-02-20 03:18:34

标签: c++ templates wrapper

为构造函数创建一个包装函数,例如以下编译就好了:

#include <iostream>

template <typename T>
class wrapper
{
public:
  template <typename A0>
  T* operator () (const A0& a0) const
  {
    return new T(a0);
  }
};

class Foo
{
public:
  Foo(int i) { std::cout << "Foo:Foo(" << i << ")" << std::endl; }
};

int main(int argc, char** argv)
{
  wrapper<Foo>()(42);
  return 0;
}

但是当我更新这行时,代码无法编译:

T* operator () (const A0& a0) const

为:

T* operator () (A0& a0) const

我的猜测是这与rvalue'42'无法绑定到非const引用有关。但是当我创建引用const时,这意味着我永远不能调用实际采用非const引用的构造函数。有人可以解释这里发生了什么,以及使它工作的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

  

我猜这与rvalue&#39; 42&#39;不能绑定到非const引用。

是。正确的。

  

但是当我创建引用const时,这意味着我永远不能调用实际采用非const引用的构造函数。

没有。不正确。您仍然可以使用非const引用来调用它。实际上,这就是const-ness的工作原理:非const引用/指针/对象可以隐式转换为const引用/指针/对象,反之亦然。

所以试一试。