- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个类似于此的类,它应该接受一个函数对象并在以后使用它:
template<typename F>
class A {
public:
A(const F& f) : _f(f) {}
A(F&& f) : _f(std::move(f)) {}
private:
F _f;
};
我还定义了一个方便的初始化函数和一个虚拟测试函数:
template<typename F>
A<F> MakeA(F&& f) {
return A<F>(std::forward<F>(f));
}
void foo() {}
我收到无法重载 A<F>::A(F&&)
的错误与 A<F>::A(const F&)
对于 F = void(&)()
当我打电话时:
auto a = MakeA(foo);
我知道我可以通过使用函数指针而不是函数引用来修复它,并且 lambda 也能很好地工作:
auto a1 = MakeA(&foo);
auto a2 = MakeA([]{});
函数引用有什么特别之处,为什么重载在那里不起作用?
最佳答案
来自 clang 的错误消息更具启发性:
6 : error: multiple overloads of 'A' instantiate to the same signature 'void (void (&&)())'
这是因为对于任何左值引用类型T = U&
,T&&
和T const&
是相同的类型,根据 [dcl.ref] 中的引用折叠规则:
6 - If [...] a type TR [is] a reference to a type T, an attempt to create the type “lvalue reference to cv TR” creates the type “lvalue reference to T”, while an attempt to create the type “rvalue reference to cv TR” creates the type TR [...]
using T = int&;
static_assert(std::is_same<T&&, T const&>::value, "!!");
真正的问题是您在其适用范围之外应用“通用引用/std::forward
”模式;它仅适用于完美转发参数。如果您传递 lambda 左值,您的代码也会中断:
auto l = []{};
auto d = MakeA(l); // breaks
编写类型推导构造函数的正确方法是将 decay
应用于参数类型(参见 make_optional
):
template<typename F>
A<typename std::decay<F>::type> MakeA(F&& f) {
return A<typename std::decay<F>::type>(std::forward<F>(f));
}
关于c++ - 基类型为函数引用时右值引用重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24549008/
经过几个小时的(重新)搜索,我无法想出普通抽象类和使用模板模式之间的可解释区别。 我唯一看到的是: 使用抽象类时,您需要实现所有方法。但是在使用模板方法时,您只需要实现这两个抽象方法。 有人可以向我解
我正在尝试实现一种算法,该算法可找到以下形状给出的外多边形的每个单独边的对应区域。也就是说,1,2 边的相应区域是 [1,6,7,8,2],2,3 边的区域是 [2,8,3] 等等,CCW 或 CW
我正在尝试在派生 self 的 BaseController 类的任何 Controller 上自动设置一个属性。这是我的 Application_Start 方法中的代码。 UnitOfWork 属
我正在使用 mgcv 包通过以下方式将一些多项式样条拟合到一些数据: x.gam smooth$knots [1] -0.081161 -0.054107 -0.027053 0.000001
考虑以下代码: void foo(){ ..... } int main() { int arr[3][3] ; char string[10]; foo();
本书The c++ programming language有这个代码: class BB_ival_slider : public Ival_slider, protected BBslider {
是否有一个 package.json 属性可用于指定模块解析应启动的根文件夹? 例如,假设我们在 node_modules/mypackage/src/file1 中有一个安装。我们要导入的所有文件都
我正在尝试使用聚合函数来实现与 SQL 查询相同的结果: 查询语句: sqldf(" SELECT PhotoID, UserID,
我正在比较使用 LOESS 回归的两条线。我想清楚地显示两条线的置信区间,我遇到了一些困难。 我尝试过使用各种线型和颜色,但在我看来,结果仍然是忙碌和凌乱。我认为置信区间之间的阴影可能会使事情变得更清
给定这段代码 public override void Serialize(BaseContentObject obj) { string file = ObjectDataStoreFold
我正在构建某种工厂方法,它按以下方式将 DerivedClass 作为 BaseClass 返回: BaseClass Factory() { return DerivedClass(); }
当重写 class delegation 实现的接口(interface)方法时,是否可以调用通常从重写函数中委托(delegate)给的类?类似于使用继承时调用 super 的方式。 来自docum
我有一个基类 fragment (如下所示)。我在其他 3 个 fragment 类中扩展了此类,每个类都共享需要在这 3 个 fragment 中访问的相同 EditText。因此,我在基类中设置了
如何在不加载额外库的情况下在 R 中计算两个排列之间的 Kendall tau 距离(又名冒泡排序距离)? 最佳答案 这是一个 O(n.log(n)) 的实现,在阅读后拼凑而成,但我怀疑可能有更好的
情况 我创建了一个具有国际化 (i18n) 的 Angular 应用程序。我想在子域中托管不同的版本,例如: zh.myexample.com es.myexample.com 问题 当我使用命令 n
std::is_base_of 之间的唯一区别和 std::is_convertible是前者在 Base 时也成立是 私有(private)或 protected Derived 的基类.但是,您何
我创建了一个名为 baseviewcontroller 的父类(super class) uiviewcontroller 类,用于包含大多数应用屏幕所需的基本 UI。它包括一个自定义导航栏和一个“自
我是一名优秀的程序员,十分优秀!