ホームページ >バックエンド開発 >C++ >「decltype」で二重括弧を使用すると、結果の型が変わるのはなぜですか?

「decltype」で二重括弧を使用すると、結果の型が変わるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-31 11:15:29840ブラウズ

Why Does Using Double Parentheses in `decltype` Change the Resulting Type?

decltype の二重括弧による型推定

C では、 decltype キーワードを使用して式の型を決定できます。二重括弧と一緒に使用すると、混乱を招く可能性のある微妙な動作が示されます。

問題:

次のコード スニペットを考えてみましょう:

<code class="cpp">const int&&& foo();
int i;
struct A { double x; };
const A* a = new A();
decltype(foo()) x1 = i;     // type is const int&&&
decltype(i) x2;             // type is int
decltype(a->x) x3;          // type is double
decltype((a->x)) x4 = x3;   // type is const double&</code>

4 行目の a->x に括弧を追加すると、結果の型が double から const double& に変わるのはなぜですか?

答え:

説明は次のとおりです。 decltype を使用して型を推定するための規則。 C 言語標準によれば:

  1. e が括弧で囲まれていない識別子またはクラス メンバー アクセスの場合、decltype(e) は e で指定されたエンティティの型を返します。
  2. If eが左辺値の場合、decltype(e) は T& を返します。ここで、T は e の型です。

指定された例では、

  • decltype(a->x) a->x をクラス メンバー アクセスとして解釈し、結果として double 型になります。
  • decltype((a->x)) は (a->x) を左辺値として解釈し、結果としてtype of const double&.

したがって、a->x に括弧を追加すると、アクセスされるメンバーの型からメンバー自体への参照への型推定が変更されます。

以上が「decltype」で二重括弧を使用すると、結果の型が変わるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。