以下最小示例不基于当前的 MSVC 2017 (19.16)。它确实基于 MSVC 2015 和 2017 (19.14) 的旧版本、GCC、Clang 和 ICC。所以我怀疑这是一个编译器错误。有效吗?如果不是,为什么?
#include <array>
#include <utility>
template<int... Is>
auto foo(std::integer_sequence<int, Is...>)
{
return std::array<int, unsigned(sizeof...(Is))>{ Is... };
}
std::array<int, 3> bar()
{
return foo(std::make_integer_sequence<int, 3>());
}
有效的变体:
- 投入
unsigned(sizeof...(Is))
在参数列表中作为默认参数 - 替换
unsigned(...)
与static_cast<unsigned>(...)
- 移除强制转换(不是现实世界代码中的解决方案,仅在最小示例中)
最佳答案
绝对是一个编译器错误。但是,它似乎已被修复。此处使用 Visual Studio 2019(MSVC 版本 19.20.27508.1)构建……
关于c++ - 在模板参数列表中使用 sizeof... 时为 "too few template arguments"(MSVC 2017),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55742234/