問題タブ [argument-dependent-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++ - 別の名前空間からの typedef を使用した ADL
私はこのようなものを持っています:
(残念ながら)に関連付けられていないため、ADL は検出されないoperator<<
ため、これは当然機能しません。私の知る限り、名前空間 std に追加できない場合があるため、std で定義することを選択した場合、それはちょっと違法になります。では...そのような状況ではどうすればよいですか?を明示的に修飾したくはありませんし、書きたくもありません。したがって、質問は次のとおりです。namespace N
MyPair
operator <<
operator <<
using namespace N
- コードをリファクタリングするには?
- ADL が typedef の名前空間を関連付けないのはなぜですか? 深刻な理由?たとえば、この場合はいいでしょう。ありがとう
c++ - 引数依存ルックアップが発明されたのはなぜですか?
引数依存ルックアップ (ADL) が発明されたのはなぜですか? cout << stuff
の代わりに書けるようにするためstd::operator<<(cout, stuff)
ですか?その場合、ADL がすべての関数ではなく演算子に限定されなかったのはなぜですか?
C++ に組み込み型とユーザー定義型の両方のジェネリック出力を行う別の方法があった場合、ADL の導入を防ぐことができたprintf
でしょうか。
c++ - Koenig ルックアップの根拠
Koenigルックアップの理論的根拠は何ですか?
コードを読みにくくし、より不安定にする何かのように考えることは避けられません。
特定のケース (つまり、非メンバー演算子) または明示的に必要な場合にのみ機能するように、Koenig ルックアップを定義できませんでしたか?
c++ - C++ 演算子ルックアップ規則 / Koenig ルックアップ
テスト スイートを作成しているときにoperator<<(std::ostream&...
、Boost 単体テストを使用するための実装を提供する必要がありました。
これはうまくいきました:
これはしませんでした:
どうやら、g++ が演算子の使用を解決しようとしたときに、2 番目は一致候補に含まれていませんでした。なぜ(これを引き起こすルールは何ですか)?
コード呼び出しoperator<<
は Boost 単体テスト フレームワークの奥深くにありますが、テスト コードは次のとおりです。
参考までに、私は g++ 4.4 を使用しています (ただし、現時点では、この動作が標準に準拠していると想定しています)。
c++ - クラス メソッド実装の本体内で「std::swap を使用する」とはどういう意味ですか?
私は、この質問に関するこの完全な説明に従って、copy-swap イディオムを学び、採用しようとしていました: Copy-Swap Idiom .
しかし、見たことのないコードを見つけました:using std::swap; // allow ADL
この例では
using std::swap;
関数実装の本体内での意味は何ですか?- ADL とはどういう意味ですか?
c++ - クラス引数を持つ関数が名前空間からリークされていますか?
私はあなたの考慮のためにここに小さなコードを持っていますが、それは私をかなり困惑させます。奇妙なことに、Sun StudioとGCCの両方でコンパイルされますが、コンパイルされるべきではないと思います。
このことを考慮:
同じ名前空間からのclass引数により、関数は名前空間f
から「リーク」し、。なしでアクセスできるようになりますname::
。
誰かがこれについての説明がありますか?確かに私であり、コンパイラがここで間違っているわけではありません。
c++ - C++での引数依存の名前ルックアップのルール
最近、ADLに関するSOについていくつか質問があり、私は考えさせられました。基本的に、ADLを実行するときにコンパイラが検索できるヘッダーファイルはわかりませんか?それはユーザーのコードに含まれているものだけですか、それともユーザーのコードで使用されているのと同じ名前空間を持つ他のヘッダーファイルを含めることができますか?例えば。std
名前空間は複数のヘッダーファイルにまたがっています。ただし、その一部のみを含めることができます。std
ここで、ヘッダーファイルのこのサブセットには含まれていないが、名前空間(インクルードしていないファイル)にはある関数を定義した場合でも、あいまいな呼び出しになりますか?私は主にこの質問に関する議論のためにこの疑問を抱きました
parameters - SCORM 2004 ADL テスト スイート エラー
tldnr:組織アイテムのパラメーター オブジェクトで "/" を許可するバリエーションが必要です。
「コンテンツ パッケージの適合性テスト」を実行しているときに、parameters 属性の場合に次のエラーが表示されます。これはコンテンツが機能するために必要な属性ですが、「/」が含まれている限り検証されません。SCORM クラウドでパッケージをテストしたところ、意図したとおりに読み込まれて起動されましたが、同様に検証する必要があります。「/」を維持するが、適切に検証できるようにするために使用できるバリエーションはありますか?
エラー: [?first=0&dir=dir/subdir] は、IMS CP 1.1.4 および "parameters" 属性の SCORM で定義された構文に準拠していません
試したバリエーション:
?dir=dir//subdir&first=0 //同じエラー
?dir=dir\/subdir&first=0 //同じエラー
?dir=dir\subdir&first=0 //同じエラー
?dir=dir/subdir&first=0 / /same error
?dir=dir⁄subdir&first=0 //xml を無効にする
さらに試したこと:
%3Ffirst%3D0%26wd%3Ddir%2Fsubdir //同じエラー
?first=0&wd=dir%2Fsubdir //同じエラー
c++ - 範囲ベースの for ループと ADL
C++0x 標準作業草案(セクション 6.5.4) では、範囲ベースの for ループで暗黙的に行われる begin() および end() 呼び出しについて次のように述べています。
'begin' と 'end' は、引数依存のルックアップ (3.4.2) でルックアップされます。この名前検索の目的で、名前空間 std は関連付けられた名前空間です。
これを読むと、begin() と end() の呼び出しに設定されたオーバーロード解決には、次のすべてが含まれることを意味します。
- 範囲ベースの for ループが使用される場所でスコープ内にある begin() および end() のすべてのオーバーロード (特に、グローバル名前空間内のすべてのオーバーロードがスコープ内になります)
- 名前空間 std の begin() と end() のすべてのオーバーロード
- 引数に関連付けられた他のネームスペース内の begin() および end() のすべてのオーバーロード
あれは正しいですか?
g++ 4.6 の動作は、この解釈と一致していないようです。このコードの場合:
次のエラーが発生します。
これは、グローバル名前空間のオーバーロードではなく、名前空間 std のオーバーロードのみを考慮していることを示唆しています。
ただし、グローバル名前空間で宣言された独自のペア クラスを使用すると、正常にコンパイルされます。
最終テストとして、my_pair を別の名前空間に配置してみました。
そして再びエラーが発生します:
そのため、名前空間 std およびその他の関連する名前空間のオーバーロードのみを考慮しているようであり、呼び出しサイトでスコープ内にあるオーバーロードは考慮していないようです (上記のリストの最初の箇条書き)。
これは gcc のバグですか、それとも標準を誤解していますか?
後者の場合、範囲ベースの for ループで std::pair オブジェクトを範囲として扱うことは不可能であることを意味しますか (std::begin() と std::end() をオーバーロードする必要はありません)。間違いは許されません)?