【问题标题】:How to use Folding Expression to initialize an array?如何使用折叠表达式初始化数组?
【发布时间】:2022-01-19 09:21:49
【问题描述】:

我遇到了一个奇怪的问题,MSVC 不允许我使用折叠表达式来初始化以下数组:

#include <iostream>

template <typename T, std::size_t ...dims>
class Matrix {
public:
    void print()
    {
        std::cout << (... + dims) << '\n';
    }
    
    T matrix[(... + dims)];      // <-- error C2059: syntax error: '...'
};

int main()
{
    Matrix<int, 3, 3, 3> m;
    m.print();
    Matrix<int, 3, 2, 1> n;
    n.print();
    return 0;
}

以下是错误:

(10): 错误 C2059: 语法错误: '...' (11): 注意: 见 对类模板实例化“矩阵”的引用 已编译 (10): 错误 C2238: ';' 前面的意外标记

我尝试了 GCC,一切正常!

是否有任何解决方法可以直接使用折叠表达式通过 MSVC 初始化数组?

非常感谢你们!

【问题讨论】:

  • 与 GCC 和 C++17 一起工作 here
  • 我撤回了我的评论。我没有意识到错误是在 third 使用 ... 时出现的——如果它确实是编译器无法识别语法的问题,它会首先抱怨前面的 2 个实例行。我在带有/std:c++20 的 VC19.30 上尝试了它,错误也在那里重现。
  • @Evg 这个可行,但我不喜欢使用虚拟变量,而我可以直接使用折叠表达式!
  • @NimaGhorab 那么您可能需要更改编译器。它看起来像 MSVC 中的一个错误。 g++clang++ 都编译得很好。你在 VS2022 beta 中试过了吗?
  • @TedLyngmo 是的,我尝试使用最新版本的 MSVC,但错误仍然存​​在。

标签: c++ arrays variadic-templates fold-expression


【解决方案1】:

这看起来像是 MS 编译器中的一个错误。与任何此类错误一样,除非您了解 MS 编译器内部结构,否则很难判断到底出了什么问题。

一种解决方法是引入一个中间成员变量:

template<typename T, std::size_t... dims>
class Matrix {
    // ...
    static constexpr std::size_t my_size = (... + dims);
    T matrix[my_size];
};

或静态成员函数:

    static constexpr std::size_t my_size() { return (... + dims); }
    T matrix[my_size()];

【讨论】:

  • 更不用说这样做我们可以在print中重用相同的my_size(),以某种方式轻松测试它,如果稍后我们决定*比@更合适987654326@,只改一处。
  • @Bob__ 也很好。谢谢。
  • @Evg 感谢您在 Microsoft 开发人员社区中提交的答案。我希望他们尽快修复这个错误!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
相关资源
最近更新 更多