ここ を見て,同様のことを試してみているつもりなのですが,話通りにならない様子です.
使用環境:
C++20 の話だということなので, Visual Studio 2022 でコンパイルオプションに /std:c++20 を指定(:プロジェクトのプロパティで「C++ 言語標準」に「ISO C++20 標準」を選択)しています.
- Q1 : 下記コードで (1)~(3) の箇所がコンパイルエラーになるのは何故でしょうか?
- Q2 : それはそれとして,
int (&)[]のような要素数不明なやつには(このようなオーバーロードの他に)何か有用な用途があるのでしょうか?
C++
1void Test( int ){ std::cout << "int\n"; } 2 3#if 0 //(1)要素数0の関数が作れない(リンク先ページの「例」には存在するのだが) 4//E0094: 配列のサイズは0よりおおきくなければなりません 5//C2084: 関数 'void Test(const int (&)[0])' は既に本体を持っています 6void Test( const int (&)[0] ){ std::cout << "int[0]\n"; } 7#endif 8 9void Test( const int (&)[1] ){ std::cout << "int[1]\n"; } 10void Test( const int (&)[2] ){ std::cout << "int[2]\n"; } 11void Test( const int (&)[3] ){ std::cout << "int[3]\n"; } 12void Test( const int (&)[] ){ std::cout << "int[unknown size]\n"; } 13 14int main() 15{ 16 Test( 1 ); //OK > int 17 18#if 0 //(2) 要素数1だとコンパイルエラーになる 19 //C2668 : オーバーロード関数の呼び出しを解決することができません 20 //(5つの Test() 全ての可能性があると言われる) 21 Test( { 1 } ); 22#endif 23 24 Test( { 1,2 } ); //OK > int[2] 25 Test( { 1,2,3 } ); //OK > int[3] 26 Test( { 1,2,3,4 } ); //OK > int[unknown size] 27 28#if 0 //(3) これらがコンパイルエラーになる. 29 //( const int (&)[] の可能性があると言われる) 30 {//C2668 : オーバーロード関数の呼び出しを解決することができません 31 int arr[1] = { 1 }; 32 Test( arr ); 33 } 34 {//C2668 : オーバーロード関数の呼び出しを解決することができません 35 int arr[2] = { 1,2 }; 36 Test( arr ); 37 } 38 {//C2668 : オーバーロード関数の呼び出しを解決することができません 39 int arr[3] = { 1,2,3 }; 40 Test( arr ); 41 } 42#endif 43 44 {//これはOK 45 int arr[4] = { 1,2,3,4 }; 46 Test( arr ); //OK > int[unknown size] 47 } 48}
回答1件
あなたの回答
tips
プレビュー
2026/04/13 13:54