2016-07-01 12 views
3
template<int const * pci> struct X {}; 
extern int const ai[]; 
X<ai> xi; 
int const ai[] = {0,1,2,3}; 

私は "打ち鳴らす++ -std = C++ 1Z" で、このコードをコンパイルしようとした場合、それはエラーになる:にextern配列++ 1Z

test.cpp:4:3: error: non-type template argument refers to subobject '&ai'

しかし、それはサブジェクトではありません。

http://en.cppreference.com/w/cpp/language/template_parametersは、型引数ではない(C++ 17以降)セクションのextern配列には適切な制限がありません。

このようなコードは、-std = C++ 14で正常に動作します。また、GCCはC++ 1zモードでもエラーなしでコンパイルします:https://godbolt.org/g/K9wZ4g

クラッグバグですか?あるいは、このコードは間違っていますか?

+4

"*ただし、サブオブジェクトではありません。*"はい、サブオブジェクトです。 C++の配列は、配列内の最初のサブオブジェクト要素へのポインタに壊れる可能性があります。さて、それはコンパイラが失敗するとは言いません。しかし、それはサブオブジェクトへのポインタを取得しています。 –

+2

@ NicolBolasこれについての楽しい部分は、[temp.arg.nontype]/1はサブオブジェクトへのポインタを禁止し、[次の段落](http://eel.is/c++draft/temp.arg.nontype #2)には、OPと一致する例があります。 –

+0

今私は完全に混乱しています。私は標準がサブオブジェクトによって何を意味しているのかを再読しました。そして、配列要素はサブオブジェクトです。標準ではポインタを非型のテンプレート引数として使用することはできません。 externだけでなく配列もあります。 –

答えて