1. ホーム
  2. c++

[解決済み] BjarneはADLのこの例について間違っていますか、それとも私はコンパイラのバグを持っていますか?

2023-06-27 23:07:17

質問

今読んでいる本 C++プログラミング言語 第4版 (傍点 ビャーネ・ストラストラップ ) について 引数依存ルックアップ . 以下はその引用です(26.3.6, Overaggressive ADL)。

引数依存参照(しばしばADLと呼ばれる)は冗長性を避けるために非常に有用です(14.2.4)。たとえば

#include <iostream>

int main()
{
    std::cout << "Hello, world" << endl; // OK because of ADL
}

引数依存のルックアップを行わない場合 endl マニピュレータは見つからないでしょう。そのままでは、コンパイラは、最初の引数が <<ostream で定義されている std . そのため endlstd を見つけ、それを( <iostream> ).

そして、ここで の結果です。 はコンパイラによって生成されます (C++11 モード)。

prog.cpp: In function ‘int main()’:
prog.cpp:4:36: error: ‘endl’ was not declared in this scope
 std::cout << "Hello, world" << endl;
                                ^

これは、コンパイラのバグか、本のバグか、どちらかです。規格ではどうなっているのでしょうか?

更新しました。

少し明確にしたいことがあります。私は、正しい答えが std::endl . 本の中の文章についての質問でした。として Lachlan Easton がすでに言っているように、単なるタイプミスではありません。段落全体が(おそらく)間違っているのです。他の(あまり知られていない)著者の本であれば、この種の誤りを受け入れることができますが、Bjarneが書いた本であるため、私は疑っていました(そして今も疑っています)。

どのように解決するのですか?

コンパイラのバグではありません。ADLは 関数 ではなく 引数 . operator<< は、ここでADLを通してパラメータを見て見つけた関数です。 std::cout と(本来は) std::endl .