2017-01-01 17 views
3

私はテンプレートと変数テンプレートを理解しようとしています。これを考慮してください:可変テンプレート部分特殊化とconstexpr

template<int M, int N> 
const int gcd1 = gcd1<N, M % N>; 

template<int M> 
const int gcd1<M, 0> = M; 

std::cout << gcd1<9, 6> << "\n"; 

これは、間違っています0を印刷します。しかし、上記のconstの代わりにconstexprを使用すると、適切な回答3が得られます。

template<int M, int N> 
struct gcd2 { 
    static const int value = gcd2<N, M % N>::value; 
}; 

template<int M> 
struct gcd2<M, 0> { 
    static const int value = M; 
}; 
std::cout << gcd2<9, 6>::value << "\n"; 

私は間違って何をしていますか?

編集: gcd1は、ベースケースの特殊化もなくコンパイルできます。どうして?私はVisual Studio 2015を使用しています。

+0

あなたがコンパイラを使用していますか? –

+0

私はVisual Studio 2015(アップデート3)を使用しています – winterlight

+2

GCC 6.3では、最初のスニペットで正しい結果が得られます。 Visual C++のことができます。 – DeiDei

答えて

1

MSVCコンパイラのバグだと思います。

thisによると、可変テンプレートはMSVC 2015更新2以降利​​用可能である必要があります。 更新3でも正常に動作していないようです。

とにかくあなたのコードがGCC 6.1で正常に動作します:wandbox

+0

MSVC 2017 RCで修正されているようです。 – Oktalist

関連する問題