GCC 10.2 不接受 lambda 空 lambda 作为 constexpr std::function<void()>



当我发现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++标准中使用显式模板参数。

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

摘自评论:

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

由于clang没有报告某些内容,并不意味着它是clang错误。

最新更新