問題タブ [name-lookup]
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.
c++ - 修飾された基本クラスの名前検索
次のコードを検討してください。
g++ からの出力は次のとおりです。
私の質問は次のとおりです。
- (1)はどのように機能しますか-基本クラスの名前は
D::S
具体的には - (1) と (2) の両方が機能する必要がありますか?
S s;
insideが を参照し、 をf()
参照しD::S
ないのはなぜ::S
ですか?
c++ - C++ 非修飾ルックアップ
次のコードがあります。
gtest operator<< & PrintTo の動作を模倣して、std 名前空間に何かを追加することは許可されていないため、ADL では実行できない一部の std クラスの動作をオーバーロードできます。ただし、通常の関数でそれを実行しようとするとf()
、のオーバーロードのf(mystd::A())
定義が遅すぎると見なされます ( f()
gccのテンプレート定義にコメントがある場合note: ‘int f(const mystd::A<int>&)’ declared here, later in the translation unit
)
問題は、なぜ と の動作が異なるのかということoperator-()
ですf()
。
c++ - 修飾名ルックアップを実行するときの Clang と GCC の間の異なる動作
次のプログラムを検討してください。
clang でコンパイルすると、次のコンパイラ エラーが発生します。
GCC ではコンパイラ エラーは発生しません。バグレポートを提出する必要があるコンパイラを見つけようとしています。どのコンパイラが正しい動作をしているか、またその理由 (c++ 標準への参照) は?
Wandbox - Clang: http://melpon.org/wandbox/permlink/s0hKOxCFPgq5aSmJ
ワンドボックス - GCC: http://melpon.org/wandbox/permlink/i2kOl3qTBVUcJVbZ
c++ - 名前検索のあいまいさの不一致
このプログラムが i の名前検索のあいまいさを与えない理由を理解しようとしています:
このように変更すると、名前の検索があいまいになります。
ここで行った唯一の変更は、名前空間 Q を削除し、代わりにそのコンテンツをグローバル名前空間に配置することです。
私は3つの異なるコンパイラで試しました:
- http://melpon.org/wandboxを使用した GCC および Clang
- http://webcompiler.cloudapp.net/を使用したビジュアル C++
すべてがこの電子メールに記載されている結果を示しており、その理由を突き止めようとしています。
C ++標準の観点から動作を説明できる人はいますか? 私はそれを理解できません。
c++ - c++ 標準でルール [namespace.udir]p2 を解釈する方法は?
[namespace.udir]p2 の意味について少し混乱しています。次のプログラムを検討してください。
メインの名前検索i
が失敗します(GCC、Clang、およびビジュアルc ++で試しました)。これは [namespace.udir]p2 ( http://eel.is/c++draft/dcl.dcl#namespace.udir-2 )と一致していないようです:
using-directive は、指定された名前空間の名前が、using-directive の後に using-directive が現れるスコープで使用できることを指定します。非修飾名ルックアップ ([basic.lookup.unqual]) の間、名前は、using ディレクティブと指定された名前空間の両方を含む、最も近い外側の名前空間で宣言されているかのように表示されます。[ 注: このコンテキストで「含む」とは、「直接的または間接的に含む」ことを意味します。— エンドノート]
私のプログラムでは、 inでi
宣言された name にこのルールを次のように適用しています。int i = 1;
X
using ディレクティブ:
using namespace X;
指名された名前空間:
X
最も近い外側の名前空間: グローバル名前空間
i
これは、 inの非修飾名検索でmain
が見つかることを意味していませんX::i
か? 試した 3 つのコンパイラのいずれでもこの結果が得られないのはなぜですか?
c++ - using-directive による using-declaration での名前検索
次のプログラムは、C++ 標準に従って整形式ですか、それとも整形式ではありませんか?
さまざまなコンパイラでさまざまな結果が得られます。
- Clang ( http://melpon.org/wandbox/permlink/c8vl7XbumyyS6vsw ): エラーはありません。
- GCC ( http://melpon.org/wandbox/permlink/immhNeWFCMcCA800 ): エラー: 'i' が宣言されていません。
このプログラムは、C++ 標準に従って整形式ですか、それとも整形式ではありませんか? C++ 標準への参照が必要です。
バグを報告する必要があるコンパイラを見つけようとしています。
c++ - 名前検索とクラス スコープ
setVal の戻り値の型が string 型で、パラメーターの型が double 型であるのはなぜですか?
c++ - using-declarations を使用する場合、修飾されていない名前のルックアップはどのように機能しますか?
これは、C++ 標準に従って、整形式または整形式ですか?
Clang はそれを拒否し、GCC はそれを受け入れます。
[namespace.udir-6] ( http://eel.is/c++draft/basic.namespace#namespace.udir-6 ) によると:
名前検索で 2 つの異なる名前空間で名前の宣言が検出され、宣言が同じエンティティを宣言せず、関数も宣言されていない場合、その名前の使用は不適切です。
これをどのように解釈すべきでしょうか。各 using 宣言は [namespace.udecl]p1 ( http://eel.is/c++draft/namespace.udecl#1 )によって名前を宣言していることに注意してください。
using 宣言は、using 宣言が現れる宣言領域に名前を導入します。
using-declaration :ネストされた名前指定子の非修飾 IDを
using typename
選択します;
using宣言で指定されたメンバー名は、using宣言が現れる宣言領域で宣言されます。[ 注: 指定された名前のみがそのように宣言されています。using-declaration で列挙名を指定しても、using-declaration の宣言領域でその列挙子が宣言されません。— 終わりの注 ] using 宣言がコンストラクター ([class.qual]) を指定する場合、using 宣言が現れるクラス ([class.inhctor]) 内のコンストラクターのセットを暗黙的に宣言します。それ以外の場合、using-declaration で指定された名前は、別の名前空間またはクラスの一連の宣言の同義語です。
したがって、名前 i の 4 つの宣言があります。
これらのうち、非修飾名検索で検索されるのはどれi
ですかsizeof(i)
?
プログラムが整形式であるように、同じ名前空間 (グローバル名前空間) にあるusing M::i;
とだけを見つけますか?using N::i;
それとも、異なる名前空間にある と だけを見つけstruct i {};
てstatic int i = 1;
、プログラムの形式が正しくないのでしょうか?
または、他の代替手段がありますか?
global-variables - D の :: 演算子に相当するものは何ですか?
D の学習を始めたばかりです。C++ では、グローバル変数とローカル変数の両方が同じ名前の場合、関数からグローバル変数にアクセスする :: (スコープ解決演算子) があります。しかし、これを D 言語で行うにはどうすればよいでしょうか。このプログラムを検討してください。
main() 関数内からグローバル変数 a の値を出力するにはどうすればよいですか? Dはそのような種類の演算子を提供していますか?