c++ - 类模板中不可能有默认的 lambda

标签 c++ templates

我发现不能创建一个工作模板类,其中有一个默认的无所事事的std::function,但是如果我们创建非模板类,就没有问题使用默认值。默认 lambda 没有捕获。请参阅:

struct Dump {
    function<void(bool)> f = [](bool) {};
};

int main() {
    Dump a;
    a.f(true);
}

上面的例子是可行的,但是当参数化时(甚至不使用参数)

template <class T>
struct Dump {
    function<void(bool)> f = [](bool) {};
};


int main() {
    Dump<bool> a;
    a.f(true);
}

编译时出现错误:

error: conversion from 'Dump<bool>::__lambda0' to non-scalar type 'std::function<void(bool)>' requested
note: synthesized method 'constexpr Dump<bool>::Dump()' first required here 

最佳答案

似乎旧版本的编译器(接近 C++ 11 引入这些功能的时间)在编译此代码时存在一些问题,但它们看起来像是编译器错误。您可以使用不同的编译器版本 here .

  • clang 自版本 3.4.1 以来的代码没有问题(大约在 C++ 11 成为现实的时候)。

  • gcc 给出了您在 4.7.14.9.0 版本中显示的错误,在 中编译它就好了>4.9.14.9.4,在 5.1 中出现内部编译器错误 (!),之后显然没有问题。

  • icc 版本 13.0.1 完全拒绝初始化程序,16.0.1 及更高版本没有问题。

  • MSVC 只有两个版本可用,从 2015 版开始,但使用语法没有问题。

因此,您的解决方案是避免使用 lambda 对 std::function 进行默认初始化,或者简单地使用更新的编译器。从长远来看,后者可能会为您省去很多痛苦。

关于c++ - 类模板中不可能有默认的 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51727230/

相关文章:

c++ - 实现模板,我有问题 "matching function definitions to existing declarations"

c++ - 编程访问Windows网络共享文件夹

c++ - 偏序可变参数模板函数 clang

c++ - 如何使用 gcc-linaro-arm-linux-gnueabihf-objdump 使用源代码行和文件名分解二进制文件?

c++ - 在运行 Symbian 的手机上显示系统信息

c++ - 如何定义在两个类之外的模板类内部的非模板类中声明的友元函数?

javascript - 将模板实例数据作为关键字参数传递给嵌套模板

php - 在 PHP 中获得基本模板的最快方法是什么,如 Struts Tiles?

c++ - 有没有办法在调用 boost::bind 对象时显式指定模板参数?

c++ - Qt 容器如何作为参数传递给共享库的函数?