配列の新しい配置をいじって、(偶然/間違いで)次のコードを思いつきました:
#include <new>
struct X{};
int main()
{
char buf[256];
std::size_t n = 10;
X* p = new (buf) (X[n]); // incorrect way, parenthesis by mistake
//X* p = new (buf) X[n]; // correct way
}
の 3 行目main
は正しくありませんが、コンパイルできます。括弧があってはなりません。clang ++が吐き出します
警告: 型が括弧内にある場合、配列は動的サイズを持つことはできません
gcc6が出力している間
警告: ISO C++ は可変長配列を禁止しています [-Wvla] X* p = new (buf) (X[n]);
警告: 非定数配列の新しい長さは、型 ID を囲む括弧なしで指定する必要があります [-Wvla] X* p = new (buf) (X[n]);
その後、tree_to_uhwi の tree.h:4044 で内部コンパイラ エラー (ICE)でクラッシュします。内部コンパイラ エラーは、gcc >= 6 でのみ表示されます。
私の質問:「正しくない」とマークされた行はどのように解析/解釈されますか?これらの括弧を使用するのはなぜ「間違っている」のですか?*
*ICE については、とにかくバグに記入します。
EDIT 1 ICE/warning(s) はユーザー定義型とは何の関係もないことに気付いたので、int
代わりにstruct X
.
編集 2 gcc6 バグはここで埋められました。ICE は gcc5 以前のバージョンでは表示されません (正しい警告のみが表示されます)。