gpt4 book ai didi

c++ - 为什么这个嵌套的 lambda 不被认为是 constexpr?

转载 作者:可可西里 更新时间:2023-11-01 18:26:11 24 4
gpt4 key购买 nike

我正在尝试使用嵌套的 constexpr lambda 创建柯里化(Currying)接口(interface),但编译器不认为它是常量表达式。

namespace hana = boost::hana;
using namespace hana::literals;

struct C1 {};

template < typename T,
std::size_t size >
struct Array {};

constexpr auto array_ = [] (auto size) {
return [=] (auto type) {
return hana::type_c<Array<typename decltype(type)::type, size()>>;
};
};

int main() {

constexpr auto c1 = hana::type_c<C1>;
constexpr auto test = hana::type_c<Array<typename decltype(c1)::type, hana::size_c<100>()>>;
constexpr auto test2 = array_(hana::size_c<100>)(c1);
}

我之前发布了一个问题,因为我发现了一个不同的最小示例,但这还不够。

错误:

test2.cpp: In instantiation of ‘<lambda(auto:1)>::<lambda(auto:2)> [with auto:2 = boost::hana::type_impl<C1>::_; auto:1 = boost::hana::integral_constant<long unsigned int, 100>]’:
test2.cpp:31:54: required from here
test2.cpp:20:16: error: ‘__closure’ is not a constant expression
return hana::type_c<Array<typename decltype(type)::type, size()>>;
^~~~
test2.cpp:20:16: note: in template argument for type ‘long unsigned int’
test2.cpp: In function ‘int main()’:
test2.cpp:31:18: error: ‘constexpr const void test2’ has incomplete type
constexpr auto test2 = array_(hana::size_c<100>)(c1);

__closure is not a constant expression :如果有人能向我解释这个错误,那将是一个很大的帮助。我以前遇到过这个错误,但不记得为什么了。

最佳答案

我将您的测试用例简化为:

#include <type_traits>

constexpr auto f = [](auto size) {
return [=](){
constexpr auto s = size();
return 1;
};
};

static_assert(f(std::integral_constant<int, 100>{})(), "");

int main() { }

正如上面的评论所述,发生这种情况是因为 size 不是函数体内的常量表达式。这不是 Hana 特有的。作为解决方法,您可以使用

constexpr auto f = [](auto size) {
return [=](){
constexpr auto s = decltype(size)::value;
return 1;
};
};

或类似的东西。

关于c++ - 为什么这个嵌套的 lambda 不被认为是 constexpr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43665610/

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