我发现一个人无法创建一个工作模板类,其中没有默认的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
答案 0 :(得分:2)
似乎旧版本的编译器(接近C ++ 11引入这些功能时)在编译此代码时存在一些问题,但它们看起来像编译器错误。您可以使用不同的编译器版本here。
clang
自版本3.4.1
起(大约在C ++ 11成为事物时),代码没有问题。
gcc
给出您在版本4.7.1
至4.9.0
中显示的错误,将其编译为4.9.1
至4.9.4
,得到内部5.1
中的编译器错误(!),之后显然没有问题。
icc
版本13.0.1
完全拒绝初始化程序16.0.1
,后来没有问题。
MSVC
仅提供两个版本,从2015年版本开始,但是使用语法没有问题。
因此,您的解决方案将是避免使用lambda来std::function
的默认初始化,或者仅使用更新的编译器。从长远来看,后者可能会减轻您的痛苦。