【问题标题】:Go around nesting limit of fold expressions绕过折叠表达式的嵌套限制
【发布时间】:2023-02-24 20:45:43
【问题描述】:

我正在使用以下代码构建“查找表”。不幸的是,GCC 拒绝编译它并带有消息Instantiating fold expression with 581 arguments exceeded expression nesting limit of 256

template<std::size_t ...parameters>
static constexpr auto buildOffsets(std::index_sequence<parameters...>)
{
    constexpr std::array<uint16_t, sizeof...(parameters)> out = {
            ((parameter_traits::offset_of<static_cast<ParameterId>(parameters)>), ...)
    };
    return out;
}

知道如何绕过这个限制吗?还有其他方法可以构建这个数组吗?

【问题讨论】:

  • offset_of里面有什么?
  • 如果将它替换为 out = {static_cast&lt;uint16_t&gt;(parameter_traits::offset_of&lt;static_cast&lt;ParameterId&gt;(parameters)&gt;)...}; ,你会遇到同样的问题吗?
  • 顺便说一句,你能提供一个 minimal reproducible example 并告诉我们你使用的是什么版本的 g++ 吗?
  • 您使用逗号折叠表达式来实例化查找表的事实是错误的。折叠表达式是初始值设定项。这不是一个查找表。
  • 对于@TedLyngmo 的建议,这似乎是上面评论所解释的错字。当然,编译器仍然可能施加限制,但我希望它不会那么低。但错误消息指的是嵌套,所以你也可能在那里有一些意外的递归(我们无法确定,因为你没有显示整个代码)。

标签: c++ c++17


【解决方案1】:

如果有人看到这个并想知道如何解决,问题不是模板深度限制,而是括号深度限制,如 in this discussion 所示。

Clang 默认对折叠表达式使用该限制,您可以使用 -fbracket-depth=N 作为 described here 提高它。

一旦你应用了错误信息就会消失。

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多