gpt4 book ai didi

c++ - GCC 10.2 不接受 lambda 空 lambda 作为 constexpr std::function

转载 作者:行者123 更新时间:2023-12-03 06:54:23 26 4
gpt4 key购买 nike

当我发现 GCC 拒绝这个看似有效的代码时,我正在玩 constexpr:

#include <functional>

constexpr void test(const std::function<void()>& a) {
a();
}

int main() {
test([](){});
}

我去了 godbolt,clang 恰好可以很好地编译这段代码。这是 GCC 中的错误吗?这是 godbolt link

最佳答案

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

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

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

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

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

取自评论:

A constexpr function must have at least one set of inputs that are able to be evaluated in a constant expression - otherwise it's ill formed no diagnostic required*

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

关于c++ - GCC 10.2 不接受 lambda 空 lambda 作为 constexpr std::function<void()>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64647661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com