C++ 使用const&vs&的模板化函数包装器参数
C++ templated function wrapper arguments using const& versus &
为构造函数创建一个包装函数,例如以下编译很好:
#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,但反之亦然。
所以试试吧。
相关文章:
- 将 N-arg 函数包装到另一个函数中
- 将函数包装器转换为 std::function
- C++函数包装器来捕获某些信号
- 考虑引用和常量的可变参数函数包装器
- 将此私有删除器函数包装在结构中的目的是什么?
- 处理模板函数包装中的void返回
- 如何使用可变模板编写通用函数包装器
- 其他成员函数的通用"成员函数"包装器?
- 为什么将函数包装到 lambda 中可能会使程序更快?
- 创建一个允许轻松创建虚拟函数包装器函数的C++宏
- 将 c++ 函数包装为 c#,具有结构的总动态大小
- 返回对 std::函数包装的 lambda 中静态变量的引用会导致段错误
- 标准库中是否有与 std::thread 的构造函数语义匹配的类型擦除函数包装器?
- 如何编写 C++ 类成员函数包装器
- 有没有一种方法可以在基于枚举的可变参数模板函数之间进行选择,这比将函数包装在结构中更简单
- 任何返回类型的可变参数函数包装器
- 具有临时函数包装器的完美转发
- 推导成员函数包装器的返回类型时出错
- 使用可变参数模板函数包装基于省略号的函数
- 将C 模板构造函数包装在模板类中