この質問をきっかけに、これが許可されているかどうか疑問に思いました。
template <typename T>
T foo(){return T{};}
struct bar {};
int main()
{
bar a = foo<decltype(a)>();
}
私が試したコンパイラは文句なしにそれを取りましたが、これが本当に合法であるかどうか、または落とし穴がないかどうかはわかりません(そしてa
宣言中にのタイプを使用するのは奇妙に見えます)。
背景:リンクされた質問で、OPauto
はタイプ(ここではbar
、SomeComplexTypeAndNotAuto
その質問では)を同時に2回回避してスペルアウトしたいので、(未使用の)パラメーターを使用してを推測しT
ます。単に型を推測するためにパラメータを誤用するのは好きではなかったので、私の最初のアイデアはでしたdecltype
。
コーシャ大丈夫です。
[basic.scope.pdecl]
1名前の宣言のポイントは、以下に記載されている場合を除き、完全な宣言子([dcl.decl])の直後で、初期化子(存在する場合)の前です。[例:
unsigned char x = 12; { unsigned char x = x; }
ここでは、初期化子がその存続期間([basic.life])の外で2番目のxにアクセスするため、2番目のxの初期化の動作は未定義です。—終了例]
そのためa
、その時点で宣言されているため、独自の初期化子で使用できます。唯一の問題はどのようにするかです。decltype
スコープ内の任意の変数に名前を付けるid式に適用できます。また、の式decltype
は未評価のオペランドであるため、UBはありません。変数のタイプのみが調べられ、不確定な値は調べられません。
しかし、味の説明はありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加