c – 无法使用比较器初始化std :: function

在我的C类中,我们学习使用函数对象等,但现在我们得到了一个代码片段,可以在教师的编译器上工作,但不在我们的编译器上(我们使用不同的操作系统).

我们使用几个编译器(MSVC,clang)测试了下面的代码片段,他们都拒绝了它,有点最小化:

#include <functional>

struct Fraction {
  Fraction();
  Fraction(int z,int n);
  Fraction(Fraction&);

  // varIoUs data members
};

struct FractionComparator {
  int operator()(Fraction a,Fraction b) {
    return 1;
  }
};

int main() {
  std::function<int(Fraction,Fraction)> comparator = FractionComparator();
}

我们对macOS表示赞同:

06001

我们已经发现添加移动构造函数可以解决问题,但是我们不知道为什么存在这种差异以及为什么这些代码不能在我们的编译器上编译.

有任何想法吗?

解决方法

为什么添加移动构造函数可以解决问题?

尝试从rvalue复制构造分数.

但是constuctor Fraction(Fraction&);采用非常量引用.不允许非const引用绑定到临时对象.
正确的构造函数签名应该是:

Fraction(const Fraction&);

当您声明移动构造函数时,编译器将从rvalue移动构造Fraction.

为什么这段代码不能在我们的编译器上编译,而是编译给老师?

代码compiles with VC++.
看起来编译器不符合此处的标准.
我可以找到更详细的this StackOverflow question.它似乎是一个允许编译的编译器扩展.
如果通过/ Za禁用编译器扩展,则将其标记will not compile.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...