@@ -164,16 +164,20 @@ auto f() -> int&& {
164164
165165任意の型名を` T ` (` T&& ` は右辺値参照型)として、戻り値型推論とコンパイル可否の変化は次のようにまとめられる
166166
167- | 関数宣言と` return ` 文| C++20| C++23|
168- | ---| ---| ---|
169- | ` auto f(T x) -> decltype(x) { return x; } ` | ` T ` : 〇| ` T ` : 〇|
170- | ` auto f(T x) -> decltype((x)) { return (x); } ` | ` T& ` : 〇| ` T& ` : ** ×** |
171- | ` auto f(T x) -> decltype(auto) { return x; } ` | ` T ` : 〇| ` T ` : 〇|
172- | ` auto f(T x) -> decltype(auto) { return (x); } ` | ` T& ` : 〇| ** ` T&& ` :** 〇|
173- | ` auto f(T&& x) -> decltype(x) { return x; } ` | ` T&& ` : ×| ` T&& ` : ** 〇** |
174- | ` auto f(T&& x) -> decltype((x)) { return (x); } ` | ` T& ` : 〇| ` T& ` : ** ×** |
175- | ` auto f(T&& x) -> decltype(auto) { return x; } ` | ` T&& ` : ×| ` T&& ` : ** 〇** |
176- | ` auto f(T&& x) -> decltype(auto) { return (x); } ` | ` T& ` : 〇| ** ` T&& ` :** 〇|
167+ | 関数宣言と` return ` 文| C++20まで| C++23から| 備考|
168+ | ---| ---| ---| ---|
169+ | ` auto f(T x) -> decltype(x) { return x; } ` | ` T ` : 〇| ` T ` : 〇||
170+ | ` auto f(T x) -> decltype((x)) { return (x); } ` | ` T& ` : 〇| ` T& ` : ** ×** | ローカル参照を返していた|
171+ | ` auto f(T x) -> decltype(auto) { return x; } ` | ` T ` : 〇| ` T ` : 〇||
172+ | ` auto f(T x) -> decltype(auto) { return (x); } ` | ` T& ` : 〇| ** ` T&& ` :** 〇| ローカル参照を返す|
173+ | ` auto f(T&& x) -> decltype(x) { return x; } ` | ` T&& ` : ×| ` T&& ` : ** 〇** | ` x ` がローカル変数の場合ローカル参照を返す|
174+ | ` auto f(T&& x) -> decltype((x)) { return (x); } ` | ` T& ` : 〇| ` T& ` : ** ×** | ` x ` がローカル変数の場合ローカル参照を返していた|
175+ | ` auto f(T&& x) -> decltype(auto) { return x; } ` | ` T&& ` : ×| ` T&& ` : ** 〇** | ` x ` がローカル変数の場合ローカル参照を返すようになる|
176+ | ` auto f(T&& x) -> decltype(auto) { return (x); } ` | ` T& ` : 〇| ** ` T&& ` :** 〇| ` x ` がローカル変数の場合ローカル参照を返す|
177+ | ` auto f(T x) -> auto&& { return x; } ` | ` T& ` : 〇| ` T&& ` : 〇| ローカル参照を返す|
178+ | ` auto f(T x) -> auto&& { return (x); } ` | ` T& ` : 〇| ` T&& ` : 〇| ローカル参照を返す|
179+ | ` auto f(T&& x) -> auto&& { return x; } ` | ` T& ` : 〇| ** ` T&& ` :** 〇| ` x ` がローカル変数の場合ローカル参照を返す|
180+ | ` auto f(T&& x) -> auto&& { return (x); } ` | ` T& ` : 〇| ** ` T&& ` :** 〇| ` x ` がローカル変数の場合ローカル参照を返す|
177181
178182右側2列の各項目内は、推論される戻り値型:コンパイル可否、のように記述しており、コンパイル可否は、〇が適格(コンパイルが通る)、×が不適格(コンパイルエラー)を表す。
179183
0 commit comments