我发现无法创建一个工作模板类,其中默认没有任何操作std::function,但是如果我们创建非模板类,则默认值没有问题.默认lambda没有捕获.请参阅:
struct Dump {
function<void(bool)> f = [](bool) {};
};
int main() {
Dump a;
a.f(true);
}
Run Code Online (Sandbox Code Playgroud)
以上示例有效,但参数化时(甚至不使用参数)
template <class T>
struct Dump {
function<void(bool)> f = [](bool) {};
};
int main() {
Dump<bool> a;
a.f(true);
}
Run Code Online (Sandbox Code Playgroud)
在编译期间得到一个错误:
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
Run Code Online (Sandbox Code Playgroud)
旧版本的编译器(接近 C++ 11 引入这些功能的时间)似乎在编译此代码时存在一些问题,但它们看起来像是编译器错误。您可以在这里使用不同的编译器版本。
clang自版本以来代码没有任何问题3.4.1(大约在 C++ 11 成为主流的时候)。
gcc4.7.1给出您在版本中显示的错误4.9.0,将其编译到4.9.1,4.9.4得到一个内部编译器错误(!)5.1,并且显然之后没有问题。
icc版本13.0.1完全拒绝初始化器,16.0.1后来就没有问题了。
MSVC只有两个版本可用,从 2015 版本开始,但语法没有问题。
因此,您的解决方案是避免std::function使用 lambda 进行默认初始化,或者简单地使用更新的编译器。从长远来看,后者可能会为您减轻很多痛苦。
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |