当我使用Visual C ++ 2010编译并运行此程序时:

#include <iostream>

int main() {
    int subtrahend = 5;

    struct Subtractor {
        int &subtrahend;
        int operator()(int minuend) { return minuend - subtrahend; }
    } subtractor5 = { subtrahend };

    std::cout << subtractor5(47);
}


我得到正确的答案,是42。

但是,编译器抱怨这是不可能的:


  Temp.cpp(9):警告C4510:main::Subtractor:无法生成默认构造函数
  Temp.cpp(6):参见main::Subtractor的声明
  
  Temp.cpp(9):警告C4512:main::Subtractor:无法生成赋值运算符
  Temp.cpp(6):参见main::Subtractor的声明
  
  Temp.cpp(9):警告C4610:不能实例化struct main::Subtractor-需要用户定义的构造函数


这是怎么回事?

最佳答案

前两个警告只是让您知道由于存在引用数据成员而无法生成隐式声明的成员函数。

第三个警告是a Visual C++ compiler bug

可以忽略所有三个警告,而不会产生不良影响,尽管您可以通过将引用数据成员改为指针来轻松地使所有三个警告消失(引用数据成员几乎不值得为此烦恼)。

关于c++ - 为什么这个仿函数(“lambda”)发出奇怪的警告?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7185474/

10-08 22:11
查看更多