問題タブ [token-name-resolution]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
126 参照

c++ - テンプレート : 名前解決 --> 継承中にこのステートメントは真ですか?

これは、ISO C++ 標準 14.6/6 のステートメントです。

クラス テンプレートの定義内またはクラス テンプレートのメンバーの定義内でtypename、型を宣言するクラス テンプレートの以前に宣言されたメンバーの非修飾名を参照する場合、キーワードは必要ありません。typename修飾子が単にクラス テンプレート名であっても、修飾名を使用してメンバーが参照される場合、キーワードは常に指定されます。【例:

キーワード typename は、修飾名がA、またはパラメーター list を持つクラス テンプレート内のシノニムであるA<T>ためにA必要です。]A<T><T>

このステートメントは継承中に当てはまりますか?

はいの場合、誰かがこれを説明できますか?

内部クラスに確認しました。それは受け入れられますか?しかし、継承で確認できませんか?

0 投票する
1 に答える
4936 参照

c++ - C++ の名前解決 (およびオーバーロード) 規則のリスト

名前解決(オーバーロードを含む)を実行するために C++ 準拠のコンパイラが適用する必要がある規則のリストはどこにありますか?

自然言語のアルゴリズムやフローチャートのようなものが欲しいです。

もちろん、C++ 標準にはこの一連のルールがありますが、新しい言語ステートメントが導入されるにつれて構築され、その結果を覚えるのはかなり困難です。

長い話を手短に言うと、「名前 'A' を見たときにコンパイラは何をするのか?」という質問に対する完全かつ詳細な答えを知りたいです。

C++ はすべて「 X の場合はこれを行い、Z が成立する場合は Y を行わない」ことを知っているので、より線形にすることが可能かどうかを尋ねています。

編集:私はこのトピックのドラフトに取り組んでいます。これは、投稿されるとまとめて改善される可能性があります。しかし、今日はとても忙しいので、何か公開できるようになるまでには時間がかかるかもしれません。誰かが興味を持っている場合は、「生のtxtファイルに関する個人的なメモ」をより良いものに昇格させて投稿します.

0 投票する
3 に答える
303 参照

c++ - クラステンプレートでの名前解決の実際の結果は、c++ 03 標準とは異なります

Xcode 4.1 および Visual Studio 2008 で、c++ 標準 ISO/IEC 14882-03 14.6.1/9 のコードをテストします。2 つのコンパイラの出力は、両方とも標準の期待される結果とは異なります。

コードは以下に貼り付けます。

規格の説明として。期待される出力は

Xcode 4.1 でコードをビルドして実行します。出力は以下のとおりです。ビルド設定で、「Compiler for C/C++/Object-C」を Apple LLVM Compiler 2.1、Gcc 4.2、LLVM GCC 4.2 に変更しようとしました。出力は同じです。

Microsoft Visual Studio 2008 でコードをビルドして実行します。出力は次のとおりです。

規格の説明(14.6.1/9)を以下に貼り付けます。

名前が (14.6.2 で定義されているように) テンプレートパラメータに依存しない場合、その名前の宣言 (または宣言のセット) は、名前がテンプレート定義に現れるポイントでスコープ内にあるものとします。名前はその時点で見つかった宣言 (または複数の宣言) にバインドされ、このバインディングはインスタンス化の時点で可視である宣言の影響を受けません。[例:

—終わりの例]

コードはコンパイラにとって整形式ですが、出力は異なります。このコードを別のプラットフォームに移植することは非常に危険です。

これらのコンパイラが標準に従わない理由を知っている人はいますか?

2011 年 10 月 11 日に編集

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#197によると、標準の例は間違っています以下のコードを Clang と Gcc でテストします。

期待どおりの出力。

ありがとう、

ジェフリー

0 投票する
3 に答える
1897 参照

c++ - グローバル名前空間の予約名

C ++でのオブジェクトの動的配列に対する私の答えから、そしてC ++識別子でアンダースコアを使用することについてのルールは何ですか?:どうやら、大文字で始まり、_その後に大文字が続く名前は、グローバル名前空間で予約されています。

17.4.3.2.1グローバル名[ lib.global.names]

名前と関数シグネチャの特定のセットは、常に実装用に予約されています。

  • __二重下線( )を含む、または下線で始まり、その後に大文字(2.11)が続く各名前は、あらゆる用途のために実装用に予約されています。
  • アンダースコアで始まる各名前は、グローバル名前空間で名前として使用するために実装に予約されています。165

165)このような名前は、名前空間::std(17.4.3.1)でも予約されています。

最初の質問に対する私の答えでは、私はこのようなクラスを持っていました

コメントでは、_Ints識別子は予約済みの名前であるため、未定義の動作を呼び出すと言われました。ただし、標準の最近のドラフトによれば、メンバー変数の名前検索は、次のルールを使用して行われます。

3.4.3.1クラスメンバー[ class.qual]

修飾IDネストされた名前指定子がクラスを指定する場合、以下にリストされている場合を除いて、ネストされた名前指定子の後に指定された名前がクラス(10.2)のスコープで検索されます。名前は、そのクラスまたはその基本クラスの1つの1つ以上のメンバーを表すものとします。

私にとって、これは、スコープがクラスであるため、メンバー変数をグローバル名前空間の一部にすることはできないことを意味します。

そして今、質問:

メンバー変数はグローバル名前空間にないため、実装の予約名の規則に違反することは決してないという私の理解は正しいですか?私が正しくない場合、誰かが私のルックアップルールの誤解を説明できますか?

0 投票する
3 に答える
281 参照

c++ - 親クラスと内部クラスが同じ名前の場合の間違った名前解決

Visual Studio 2003 の奇妙なケースがあります。ある程度正当な理由から、次の階層があります。

つまり、外部クラスの親と同じ名前の内部クラスがあります。Cから継承しようとすると、 Visual Studio は、 内のネストされたクラスではなく、B::A親クラスを指していると見なします。予想通り、GCCは内部クラスのバージョンに解決されるようですAB

これは Visual Studio 2003 のバグですか、それとも間違っていますか? 回避策はありますか (Visual Studio のアップグレード以外)?

0 投票する
1 に答える
60 参照

c++ - テンプレート化された派生クラスのテンプレート化された基本クラスからメンバーを呼び出すにはどうすればよいですか?

この設定では:

すべてが正常に動作します。ただし、この例では:

私は得る:

違いは何ですか?2番目の原因で構文エラーが発生するのはなぜですか?

0 投票する
1 に答える
6255 参照

c++ - メソッドの宣言でシンボルの意味が変わる

次のコードの場合:

GCC でコンパイラ エラーが発生します。

しかし、clang はコンパイラ エラーなしでそれを受け入れます。誰が正しいですか?

typedef が削除されるか、に変更された場合typedef ::foo foo_type、gcc と clang の両方がコードを受け入れることに注意してください。

0 投票する
3 に答える
235 参照

c++ - 名前空間の検出

外部ツールを使用するログ ライブラリを作成しようとしています。

ライブラリをより自然に使用できるようにするために、cout が使用されている名前空間を検出できるようにしたいと考えています。

具体的には、結果は次のように使用する必要があります

結果の出力は次のようになります

私はすでにstd::streambuf特定のキーワードを cout の出力に追加するために使用しています。必要なのは、どの名前空間でどの streambuf を使用するかを指定することだけです。

どうすればこれを達成できますか?

また、私が作成しているライブラリは、using namespace宣言を多用する複数の名前空間を持つプロジェクトに統合される予定です。これらの宣言を削除する必要のない解決策が必要です。

edit1:どの名前空間がどの文字列に関連付けられているかを手動で指定したり、使用されている名前空間にオブジェクトを追加したりする必要はありません (stdもちろん例外)

0 投票する
1 に答える
564 参照

c++ - c++ 名前空間の解決 (引数に基づく「自動使用」?)

この名前空間の外から名前空間で宣言された関数を呼び出すときは、通常、明示的に名前空間のプレフィックスを付ける必要があります。

ただし、コンパイラが使用する関数を自動的に考案できるように見えるこの状況があります。

Q1: コンパイラが引数の型に基づいて適切な関数を自動的に選択できるためですか? または、他の何か?


さらにテストした結果、別の名前空間に同じ宣言を持つ別の関数を追加しても、コンパイラは文句を言わないことがわかりました。

Q2: この動作を無効にするにはどうすればよいですか?

編集: 私のコンパイラ:gcc version 4.7.2 (Debian 4.7.2-5)