次のコードは正当ですか?
template <int N>
class foo {
public:
constexpr foo()
{
for (int i = 0; i < N; ++i) {
v_[i] = i;
}
}
private:
int v_[N];
};
constexpr foo<5> bar;
Clangはそれを受け入れますが、GCCとMSVCはそれを拒否します。
GCCのエラーは次のとおりです。
main.cpp:15:18: error: 'constexpr foo<N>::foo() [with int N = 5]' called in a constant expression
15 | constexpr foo<5> bar;
| ^~~
main.cpp:4:15: note: 'constexpr foo<N>::foo() [with int N = 5]' is not usable as a 'constexpr' function because:
4 | constexpr foo()
| ^~~
main.cpp:4:15: error: member 'foo<5>::v_' must be initialized by mem-initializer in 'constexpr' constructor
main.cpp:12:9: note: declared here
12 | int v_[N];
| ^~
この種のコードで問題がなければ、index_sequence
sの使用をかなり減らすことができます。
1
Gcc10もそれを受け入れます。
—
songyuanyao
MSVCからのエラーを記録できますか?
—
max66
...そしてGCCも。
—
1
@songyuanyao-g ++ 10はC ++ 20をコンパイルしてそれを受け入れます。C ++ 17以前のコンパイルを拒否します。ポイントは、
—
max66
_v
C ++ 17まで、初期化リストで初期化する必要があるようです。たぶんC ++ 20で何かが変更されています。
それはクランが静的ストレージ期間オブジェクトは「言うことをゼロにされることをその「意識」を使用して提案することができるので、実際に面白い@Evgは大丈夫、このオブジェクトは、デフォルト・初期化されている可能性がありますが、そのから読み込む
—
オービットのライトネスレース
int
メンバーは、未定義の動作を持っていることはありません」GCCがそれを実行していないのは準拠しているのか、それともその逆か...