静的メンバ関数における `this` の型は?
質問
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++ 標準議論ニュースグループでこの問題を提起することをお勧めします。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み】静的定数文字列(クラスメンバ)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む