std::integer_sequence では列挙値は使用できますか? 質問する

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, I...> では T が整数型である必要があります。'

ベストアンサー1

アップデート:

私が提出しました広報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); }
  };
}

義務: はT整数型です。

integral_constant対照的に、には の要件がないためT、 のようなものでもintegral_constant<pair<int, int>, pair{0, 0}>C++20 ではまったく問題ないことに注目してください。


† Clangのlibc++はフラグを介して有効にする必要があり-stdlib=libc++、また、対応するstatic_assert実装中integer_sequence

おすすめ記事