类模板中没有默认lambda的可能性

时间:2018-08-07 12:49:06

标签: 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 

1 个答案:

答案 0 :(得分:2)

似乎旧版本的编译器(接近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的默认初始化,或者仅使用更新的编译器。从长远来看,后者可能会减轻您的痛苦。