首页 > 解决方案 > 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 中的错误吗?这是上帝的链接

标签: c++gcc

解决方案


正如评论中已经提到的,std::function它本身不能在环境中使用constexpr,因为它operator()()的构造函数std::function也不是 constexpr。

因此,您可以直接使用指向函数的指针,如果您捕获的 lambda 较少,或者您可以在 C++20 中像这样模板化您的函数:

constexpr void test(auto&& a) {
    a();
}

或在旧 C++ 标准中使用显式模板参数。

使用autoorauto&auto&&根据需要允许临时 lambda,将其移入或复制它(优化后可能相同)

摘自评论:

constexpr 函数必须具有至少一组能够在常量表达式中评估的输入 - 否则它的格式不正确,不需要诊断*

由于 clang 没有报告某些东西并不意味着它是一个 clang 错误。


推荐阅读