91702


cppreference の例文ですが、このエラーが理解できないです。両方とも引数 2 つのコンストラクタで初期化されるはずだが、なぜ一つ目の
`std::` がエラーになるのか教えていただければ幸いです。

[一様初期化 - cpprefjp
C++日本語リファレンス](https://cpprefjp.github.io/lang/cpp11/uniform_initialization.html)

[code]

    #include <iostream>
    #include <vector>
    #include <iterator>
    
    int main()
    {
      // コンパイルエラー！関数宣言構文とみなされるが、パラメータ名（std::cin）が名前空間修飾付きのため、エラー
    //std::vector<char> vec(std::istream_iterator<char>(std::cin),
    //                      std::istream_iterator<char>());
    
      // vec は引数 2 つのコンストラクタで初期化された std::vector<char> 型の変数
      std::vector<char> vec{std::istream_iterator<char>(std::cin),
                            std::istream_iterator<char>()};
    }
    
[/code]


CC BY-SA 4.0
2022-10-20T13:49:10.927
91699
2022-10-21T00:52:48.410
2022-10-21T00:52:48.410
3060
53858
question
c++ c++11
丸括弧と波括弧の妙な違い


C++言語には過去バージョンと一定の互換性があります。C++11にて波括弧`{}`を使用した一様初期化が導入されたとして、それは丸括弧`()`の動作を変えるものではありません。

>
[code]

>     // コンパイルエラー！関数宣言構文とみなされるが、パラメータ名（std::cin）が名前空間修飾付きのため、エラー
>     std::vector<char> vec(std::istream_iterator<char>(std::cin),
>                           std::istream_iterator<char>());
>  
[/code]

はC++11一様初期化とは関係なく、従来バージョンにおいてもコンパイルエラーを引き起こします。具体的には

[code]

    int func(int param1, int param2);
    
[/code]

と同じ形式をしており、コンパイラーはこの行を関数のプロトタイプ宣言と解釈します。なおプロトタイプ宣言において引数名`param1`、`param2`は省略可能です。ここで

  * 戻り値： `std::vector<char>` → 型名として適切
  * 関数名： `vec` → 識別子として適切
  * `param1`の型： `std::istream_iterator<char>(std::cin)` → **型名として不適切**
  * `param2`の型： `std::istream_iterator<char>()` → **型名として不適切**

このためコンパイルエラーとなります。

* * *

丸括弧`()`には関数のプロトタイプ宣言として解釈されるという欠点がありますが、波括弧`{}`一様初期化は構文が異なるため、このような欠点がありません。


CC BY-SA 4.0
2022-10-20T20:40:43.703
91702
2022-10-20T20:40:43.703
4236
91699
answer