C++ 構造体配列の初期化時に丸括弧を使用した場合に何が起きていますか


例としてPoint構造体があり、それをC形式の配列に格納したいとします。  
下記のように各要素を丸括弧で定義した場合、コンパイルエラーは発生しませんが  
出力結果は期待通りとなりません。  
Printされる値は5要素のみで、順番もよく分からないものになってしまいます。

ちなみに、vectorを使った場合はコンパイルエラーになりました。

[code]

    #include <iostream>
    #include <vector>
    
    struct Point {
        int32_t x;
        int32_t y;
    };
    
    int main()
    {
        Point points[] {
            (-1, -1), ( 0, -1), ( 1, -1),
            (-1,  0), ( 0,  0), ( 1,  0),
            (-1,  1), ( 0,  1), ( 1,  1),
        };
    
        for (auto i = std::begin(points) , e = std::end(points); i != e; ++i)
        {
            printf("(%2d,%2d)\n", i->x, i->y);
        }
    
        /*
        std::vector<Point> points{ // コンパイルエラー
            (-1, -1), (0, -1), (1, -1),
            (-1,  0), (0,  0), (1,  0),
            (-1,  1), (0,  1), (1,  1),
        };
        */
    
        return 0;
    }
    
[/code]

[code]

    (-1,-1)
    (-1, 0)
    ( 0, 0)
    ( 1, 1)
    ( 1, 0)
    
[/code]

下記のように各要素を波括弧で初期化することで期待通り、9要素が出力されます。

[code]

    Point points[] {
        {-1, -1}, { 0, -1}, { 1, -1},
        {-1,  0}, { 0,  0}, { 1,  0},
        {-1,  1}, { 0,  1}, { 1,  1},
    };
    
[/code]

[code]

    (-1,-1)
    ( 0,-1)
    ( 1,-1)
    (-1, 0)
    ( 0, 0)
    ( 1, 0)
    (-1, 1)
    ( 0, 1)
    ( 1, 1)
    
[/code]

先に書いたように、各要素を丸括弧で囲んだ場合に起きている現象について  
理解が出来ない為、ご教示をお願いします。  
コンパイラになぜ5要素であると認識されるのでしょうか。

[動作環境]  
Microsoft Visual Studio Community 2022  
Version 17.4.4  
VisualStudio.17.Release/17.4.4+33213.308

[プラットフォームツールセット] Visual Studio 2022 (v143)  
[C++ 言語標準] ISO C++17 標準  
[C 言語標準] 既定 (従来のMSVC)




`(x, y)`
は[コンマ演算子](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%9E%E6%BC%94%E7%AE%97%E5%AD%90)
な式 `x, y` を括弧でくくって優先順位付けしたものと解釈されるので、提示 `points` の初期化は結局コンマの右要素だけが有効となり

[code]

    Point points[] {
        (-1, -1), ( 0, -1), ( 1, -1), // は -1, -1, -1 と読まれます
        (-1,  0), ( 0,  0), ( 1,  0), // は 0, 0, 0 と読まれます
        (-1,  1), ( 0,  1), ( 1,  1), // は 1, 1, 1 と読まれます
    };
    
[/code]

書き直すと

[code]

    Point points[] {
        -1, -1,
        -1, 0,
         0, 0,
         1, 1,
         1
    };
    
[/code]

１要素につき初期化子が２つ必要なのに、コード上は初期化子が９個しかないので最後の要素に対して初期化子 `0` が補われて提示の結果となります。




`(x, y)`
は[コンマ演算子](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%9E%E6%BC%94%E7%AE%97%E5%AD%90)
な式 `x, y` を括弧でくくって優先順位付けしたものと解釈されるので、提示 `points` の初期化は結局コンマの右要素だけが有効となり

[code]

    Point points[] {
        (-1, -1), ( 0, -1), ( 1, -1), // は -1, -1, -1 と読まれます
        (-1,  0), ( 0,  0), ( 1,  0), // は 0, 0, 0 と読まれます
        (-1,  1), ( 0,  1), ( 1,  1), // は 1, 1, 1 と読まれます
    };
    
[/code]

書き直すと

[code]

    Point points[] {
        -1, -1,
        -1, 0,
         0, 0,
         1, 1,
         1
    };
    
[/code]

１要素につき初期化子が２つ必要なのに、コード上は初期化子が９個しかないので最後の要素に対して初期化子 `0` が補われて提示の結果となります。

