c++ - GCC 10.2 不接受 lambda 空 lambda 作为 constexpr std::function
问题描述
当我发现 GCC 拒绝了这个看似有效的代码时,我正在玩弄 constexpr:
#include <functional>
constexpr void test(const std::function<void()>& a) {
a();
}
int main() {
test([](){});
}
我去了godbolt,clang恰好可以很好地编译这段代码。这是 GCC 中的错误吗?这是上帝的链接
解决方案
正如评论中已经提到的,std::function
它本身不能在环境中使用constexpr
,因为它operator()()
的构造函数std::function
也不是 constexpr。
因此,您可以直接使用指向函数的指针,如果您捕获的 lambda 较少,或者您可以在 C++20 中像这样模板化您的函数:
constexpr void test(auto&& a) {
a();
}
或在旧 C++ 标准中使用显式模板参数。
使用auto
orauto&
或auto&&
根据需要允许临时 lambda,将其移入或复制它(优化后可能相同)
摘自评论:
constexpr 函数必须具有至少一组能够在常量表达式中评估的输入 - 否则它的格式不正确,不需要诊断*
由于 clang 没有报告某些东西并不意味着它是一个 clang 错误。
推荐阅读
- azure - Azure Function App 是否仅将函数内部的传出 HTTP 调用限制为 HTTPS?
- file - Ionic 4 写入 json 文件被 CORS 阻止
- wordpress - 如何在受密码保护的 Wordpress 页面上显示密码字符
- dart - Dart 代码重新格式化没有给我预期的格式
- python - 什么是 __weakrefoffset__?
- angular - 错误:无法解析 ReceivedQuickreplyMessageComponent: (?) 的所有参数。错误属性:Object({ ngSyntaxError: true })
- javascript - 如何从 iframe 中加载回调 Sso
- mobile-safari - 如果在播放音频时初始化麦克风,Safari 上的 iPhone 会混淆将音频输出到哪个扬声器
- python - Python 3 - pip install --user 标志找不到安装
- css - 如何更改网格的顺序方向?