問題タブ [name-hiding]
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++ - 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;
、プログラムの形式が正しくないのでしょうか?
または、他の代替手段がありますか?
java - Java のネストされたスコープと変数の名前の非表示
私は Java で名前の検索を学んでおり、C++ から来て、Java でコードのブロックをいくつでもネストできる場合でも、最初のネストされたスコープでのみ名前を非表示にできることに興味を持ちました。
これは、C++ の観点からは奇妙です。必要なスコープの数をネストでき、変数を好きなように非表示にできるからです。これは Java の通常の動作ですか、それとも何か不足していますか?
c++ - C++ の継承と名前の隠蔽
これがこの件に関する最初の質問ではないことはわかっていますが、私が読んだ他の関連するすべての質問 (および回答) は、少し的外れでした。コードを取る
このコードを最近のバージョンの g++ でコンパイルすると、エラーが発生します
答えを見つけるために Stackoverflow に出くわしたのは、このエラーのためです。しかし、どの回答も私を納得させるものではありませんでした。2 つのメソッドのシグネチャは、それらを区別する際にあいまいさを示しません。コンパイラは、基本クラスのメソッドを取得できるはずです。コメントアウトするだけ
コードは期待どおりに機能します。つまり、基本クラスで同じ名前のメンバー関数を非表示にするのはメンバー関数名だけであり、関数名がマングルされていない場合のように、署名は考慮されません (この場合、マングルはあいまいさを解決する必要があります)。同様の質問で、これは C++ の精神 (およびオブジェクト指向、私が付け加えます) に反するものであると他の人が書いており、私は彼に完全に同意します。これは関数のオーバーロードの制限であり、私には明確な理由が見当たりません。
どうやら質問はクローズされているようです。そのため、回答を読んだ後、自分の最初の質問を編集する以外に返信を追加することはできません。古い C++ コンパイラでは、最初の質問のコードが問題なくコンパイル (および実行) されることを確信しています (ただし、それを証明する立場にはありません)。私の要点は、その言語設計の背後にある理論的根拠が本当にわからないということです(返信で呼ばれているように)。この場合、コンパイラは適切なアクションを実行するためにすべての情報を利用できます。これは私が期待することです。それ以外の場合は、言語設計の選択により、メンバー関数のシグネチャを考慮しないように選択されているように見えますが、これはかなり奇妙に聞こえます。先ほどの「プログラマーインタビュー」の記事を読んで、
c++ - コンパイラエラーを与える関数名と同じ変数名...なぜですか?
今日興味深い問題に遭遇し、その理由を理解しようとしています。
次の点を考慮してください。
次のエラーが表示されます。
明白な呼び出しの括弧の前にある式は、(ポインターへの) 関数型でなければなりません
このエラーが発生する理由を理解していると思います:
function1
が の外で単独で呼び出される場合function2()
、実際には への関数ポインタfunction1()
です。のスコープ内で
function2
がint function1
宣言されると、'function1
変数' が 'function1
関数ポインタ' を隠します。function1()
内部で が呼び出されると、が変数であるとfunction2()
想定され、エラーが発生します。function1
Base::function1();
これは、 insideを呼び出すことで修正されfunction2()
ます。
私の質問はこれです:宣言時にコンパイラがエラーを出さないのはなぜint function1;
ですか? これは許されるべきではないのですか?
c++ - c++ コンパイラ (VS2013) が間違った関数を選択するのはなぜですか?
最初のケース
/li>
完璧に動作します。
プログラム出力
Write(int) が呼び出される
2.2番目のケース。
最初の関数を基本クラスに移動するだけです:
プログラム出力
Derived::Write(wchar_t) が呼び出されまし
たが
、「Base::Write(int) が呼び出された」と予想
しました。
ruby - コード スニペットのクラス名と変数名を置き換える
コードの要点を CV に挿入したいと思います。このコードが何であるかを理解しないために、すべてのクラス、メソッド、および変数名をランダムな文字列に自動的に置き換えて (スクリプトまたはオンライン クリエーターを使用して?)、「私の書き方」を示すことができるようにしますが、実際の機能は表示されません。
私はに変更したい:
または、誰かが他の人に「私のコードはどのように見えるが、機能を示さずに」表示するより良い方法を知っているのでしょうか?
前もって感謝します
c++ - C++ がスコープ間のオーバーロードをサポートしないのはなぜですか?
最良の答えはすでにここで与えられていると思います:派生クラスのオーバーライドされた関数は、基本クラスの他のオーバーロードを隠すのはなぜですか?
しかし、特にステートメントで、私は少し混乱しています:
この動作をオーバーライドするには、明示的なアクションがユーザーに必要です。元は継承されたメソッドの再宣言 (現在は非推奨) でしたが、現在は using-declaration を明示的に使用しています。
次のプログラムがあるとします。
2 つの質問があります。
派生クラスオブジェクトに関して、
int f(int i)
関数はまったく存在しないと思いますか。名前が隠されているため、これは継承されません。この関数を派生クラスで使用する必要がある場合は、派生クラスで再度定義する必要がありますか?