81

、The C++ Programming Language, 4th Edition (by Bjarne Stroustrup ) を読んでいます。これが引用です(26.3.6、過度に攻撃的なADL):

引数依存のルックアップ (ADL と呼ばれることが多い) は、冗長性を避けるために非常に役立ちます (14.2.4)。例えば:

#include <iostream>

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

引数依存のルックアップがなければ、endlマニピュレータは見つかりません。<<そのままで、コンパイラは への最初の引数がostreamin で定義されていることに気付きますstd。したがって、endlinstdを検索して見つけます ( in <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によって書かれたので、私は(そして今でも)疑問を抱いていました.

4

6 に答える 6

8

私はその本を持っていませんが、これは本の誤りのようです。名前空間修飾子が欠落しているという事実は、ADL とは何の関係もありません。である必要がありますstd::endl

于 2013-08-06T17:09:54.600 に答える