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

C++ templated function wrapper arguments using const& versus &

本文关键字:函数 包装 参数 使用 const vs C++      更新时间:2023-10-16

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

#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

我的猜测是,这与右值'42'不能绑定到非常量引用有关。但当我将引用设为常量时,这意味着我永远无法调用一个实际接受非常量引用的构造函数。有人能解释一下这里发生了什么,做什么才是正确的吗?

我的猜测是,这与右值'42'不能绑定到非常量引用有关。

是的。对的

但当我将引用设为常量时,这意味着我永远无法调用一个实际接受非常量引用的构造函数。

没有。不准确的您仍然可以使用非常量引用来调用它。事实上,constness就是这样工作的:非const引用/pointer/object可以隐式转换为const引用/pointer/object,但反之亦然。

所以试试吧。