6

配列の新しい配置をいじって、(偶然/間違いで)次のコードを思いつきました:

#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 以前のバージョンでは表示されません (正しい警告のみが表示されます)。

4

1 に答える 1

3

括弧を使用すると、新しく作成されるタイプはtype-idから取得されます。この場合はX[n]です。これは可変長配列であり、標準的な動作ではありません。括弧がない場合、新しく作成される型はnew-type-id、つまり の配列ですX

于 2016-09-24T02:36:55.440 に答える