当我发现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
、auto&
或auto&&
来允许临时lambda,将其移入或复制(优化后可能相同(
摘自评论:
constexpr函数必须至少有一组能够在常量表达式中求值的输入,否则它的格式不正确,不需要诊断*
由于clang没有报告某些内容,并不意味着它是clang错误。