c++ - 为什么 lambda 的 std::function 构造无法编译?

标签 c++

为什么下面的行不能编译?

std::function<void (int)> f = [](int&){};

但许多其他替代方案可以:

    [[maybe_unused]]
    std::function<void (const int&)> f1 = [](const int&){};
    //[[maybe_unused]]
    // doesnt compile because losing constness
    //std::function<void (const int&)> f2 = [](int&){}; 
    [[maybe_unused]]
    std::function<void (const int&)> f3 = [](int){};
    [[maybe_unused]]
    std::function<void (const int&)> f4 = [](const int){};
    [[maybe_unused]]
    std::function<void (int&)> f5 = [](const int&){};
    [[maybe_unused]]
    std::function<void (int&)> f6 = [](int&){};
    [[maybe_unused]]
    std::function<void (int&)> f7 = [](int){};
    [[maybe_unused]]
    std::function<void (int&)> f8 = [](int){};
    [[maybe_unused]]
    std::function<void (const int)> f9 = [](const int&){};
    //[[maybe_unused]]
    // doesnt compile because losing constness
    //std::function<void (const int)> f10 = [](int&){};
    [[maybe_unused]]
    std::function<void (const int)> f11 = [](const int){};
    [[maybe_unused]]
    std::function<void (const int)> f12 = [](int){};
    [[maybe_unused]]
    std::function<void (int)> f13 = [](const int&){};
    //[[maybe_unused]]
    // doesnt compile because ??
    //std::function<void (int)> f14 = [](int&){};
    [[maybe_unused]]
    std::function<void (int)> f15 = [](const int){};
    [[maybe_unused]]
    std::function<void (int)> f16 = [](int){};

我的理解是 std::function 有一个 () 运算符,它接受参数并使用参数调用仿函数的 () 运算符 因此,对于例如, - 第一个采用 const ref ,下一个采用拷贝。

按照这条逻辑,我认为 int 拷贝应该能够作为 int& 向前传递。有人可以解释一下吗?

最佳答案

std::function forwards这是对其目标的论据。无法使用右值调用分配给 f14 的 lambda。

你对f10的看法也不正确,即is the same casef14。顶级 const 在参数中被忽略。 f11f12f15f16 的大小写相同。

关于c++ - 为什么 lambda 的 std::function 构造无法编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70753041/

相关文章:

c++ - 如何通过 C++ 中的函数退出 while 循环

c++ - 对 'vtable for 的 undefined reference

c++ - 将静态链接库变成动态链接库

c++ - CString 内崩溃

c++ - 如何在 MFC 中创建预呈现输入窗口?

c++ - 在 C++ 中消除名称冲突的最佳方法

c++ - 可以采用 lambda 或函数指针并推断参数以传递给另一个模板的模板函数

c++ - directx 9 与 Visual Studio 2012 Express

c++ - 将 C 代码移植到 C++,将 void* 从 malloc 转换为所需指针的问题

c++ - 类中静态成员的地址