提问人:jtl313 提问时间:11/9/2023 最后编辑:Ch3steRjtl313 更新时间:11/10/2023 访问量:1286
std::integer_sequence中是否允许枚举值?
Are enum values allowed in a std::integer_sequence?
问:
此代码使用 GCC 13 和 Clang 17 编译和执行良好,但无法在 MSVC 上编译。我想知道代码是否需要按照标准工作,或者这是否是 MSVC 的问题。演示
#include <utility>
#include <iostream>
enum e : int { A=5, B, C, D };
auto x = std::integer_sequence<e, A, B, C, D>{};
auto y = std::integer_sequence<unsigned, 9, 4, 3, 8>{};
auto z = std::integer_sequence<int, 0, 1, 2, 3>{};
template<typename T, T... ints>
void print_sequence(std::integer_sequence<T, ints...> int_seq)
{
std::cout << "The sequence of size " << int_seq.size() << ": ";
((std::cout << ints << ' '), ...);
std::cout << '\n';
}
int main(int, char**)
{
print_sequence(x);
print_sequence(y);
print_sequence(z);
return 0;
}
MSVC 给出以下错误:
错误 C2338:static_assert失败:“integer_sequence<T,我...>要求 T 是整数类型。
答:
更新:
我提交了 PR 112473,这已在 GCC-trunk 中修复。
MSVC-STL 和 libc++† 是正确的,因为它不是整数类型(即 是 )。e
std::is_integral_v<e>
false
来自 [intseq.intseq]:
namespace std { template<class T, T... I> struct integer_sequence { using value_type = T; static constexpr size_t size() noexcept { return sizeof...(I); } }; }
Mandates:是整数类型。
T
值得注意的是,相比之下,对 没有要求,所以像这样的东西在 C++20 中是完全可以的。integral_constant
T
integral_constant<pair<int, int>, pair{0, 0}>
† Clang 的 libc++ 需要通过标志启用,在实现中也有对应的static_assert
。-stdlib=libc++
integer_sequence
评论
template <std::integral T>
requires
ENABLE_IF
Clang 和 gcc 在接受程序时是错误的,因为不是整数 type() 将失败),并且 的第一个模板参数必须是整数类型。e
static_assert(std::is_integral_v<e>
std::integer_sequence
template< class T, T... Ints > class integer_sequence; (since C++14)
模板参数 - 用于序列元素的整数类型
T
char、wchar_t、char8_t、char16_t 和 char32_t 类型统称为字符类型。 字符类型、bool、有符号和无符号整数类型以及它们的 cv 限定版本 ([basic.type.qualifier]) 统称为整数类型。 整型的同义词是整数型。
您还可以使用static_assert进行检查:
static_assert(std::is_integral_v<e>); //msvc, gcc and clang all fail this as expected
解决方法
您可以使用 std::underlying_type
:
auto x = std::integer_sequence<std::underlying_type_t<e>, A, B, C, D>{};
评论
:integer_sequence<std::underlying_type_t<e>,...>
。