1. ホーム
  2. c++

静的メンバ関数における `this` の型は?

2023-09-06 21:01:05

質問

C++ 5.1.1/3 [expr.prim.general]に書いてあります。

の型と値のカテゴリ] は this ] は静的メンバ関数内で定義されます。

これはどういう意味ですか? どのように関連するのでしょうか?

注意してください。

this は、静的メンバ関数の宣言に現れてはなりません。

どのように解決するのですか?

規格の文言は、元をたどれば n3282 であり、これは欠陥の解決策である 1207 1017 . 特に、この文言は欠陥 1207 の解決案で登場するため、その欠陥が対処された当時の標準の文脈で検討されるべきものです。 当時は、id 式を *this (9.3.1p3) を使ってメンバーアクセス式に書き換えること、 特に trailing-return-type 宣言のコンテキストで懸念がありました (see issue 945 ).

不具合1207に対する解決案を、n3282やその後の標準での最終的な言語と比較すると、9.3.1p3に対して1つの大きな違いがあります。

不具合 1207

クラスメンバアクセス構文 (5.2.5 [expr.ref]) の一部ではなく、メンバへのポインタ (5.3.1 [expr.unary.op]) を形成するために使用されていない id 式 (5.1 [expr.prim]) が、次のように使用されている場合。 クラスのメンバ関数の宣言で X もし、名前検索(3.4 [basic.lookup])で解決されるなら...

n3282 と C++11 です。

クラス メンバ アクセス構文 (5.2.5 [expr.ref]) の一部ではなく、メンバへのポインタの形成 (5.3.1 [expr.unary.op]) にも使用されない id 式 (5.1 [expr.prim]) が、次のように使用される場合。 クラスのメンバ X というコンテキストで this が使える (5.1.1 [expr.prim.general]) 名前検索 (3.4 [基本.lookup])で解決される場合、[...]です。

欠陥 1207 の解決案が、静的メンバ関数内の (静的メンバへの) id 式は次のように変換する必要があるという信念を持っていたことは明らかです。 *this メンバアクセス式に変換する必要があり、そのため、型と値のカテゴリである this . n3282が書かれた時点で,これは,修飾されたid変換(9.3.1p3も)を支持して解決されていた。 this を必要としませんが、5.1.1p3 の言語は消えずに残っていました。

私は、C++ 標準議論ニュースグループでこの問題を提起することをお勧めします。