Bjarne对这个ADL的例子是错误的,还是我有编译器错误?

mav*_*rik 80 c++ argument-dependent-lookup c++11

我正在阅读C++编程语言,第4版(由Bjarne Stroustrup撰写)关于.这是引用(26.3.6,Overaggressive ADL):

依赖于参数的查找(通常称为ADL)对于避免冗长非常有用(14.2.4).例如:

#include <iostream>

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

如果没有依赖于参数的查找,则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;
                                ^
Run Code Online (Sandbox Code Playgroud)

这是编译器或书中的错误.标准说什么?

更新:

我需要澄清一下.我知道正确的答案是使用std::endl.问题是关于书中的文字.正如Lachlan Easton所说,这不仅仅是一个错字.整段是(可能)错了.如果这本书是由另一位(鲜为人知的)作者写的,我可以接受这种错误,但我(并且仍然)怀疑,因为它是由Bjarne写的.

Pet*_*der 83

这不是编译器中的错误.ADL用于查找函数而不是参数.operator<<是通过查看参数std::cout和(应该是什么)通过ADL找到的函数std::endl.

  • 实际上,回想起来,这通过利用`std :: endl`实际上(并且令人困惑地)一个函数这一事实来激发一种使代码有效的方法:`endl(std :: cout <<"你好,世界"); // OK,因为ADL` (2认同)

Lac*_*ton 49

对于那些说它是拼写错误的人来说,事实并非如此.Bjarne犯了一个错误,或者编译器错了.OP发布的一段之后的段落

如果没有依赖于参数的查找,则无法找到endl操纵器.实际上,编译器注意到<<的第一个参数是在std中定义的ostream.因此,它在std中查找endl并找到它(in <iostream>).

  • 你先生似乎是这里唯一真正读过这本书的人.它要么是语言规则的重大变化,要么所有当前的C++编译器都是非标准的(对于C++ 11),要么是Stroustrup先生的一个明显的错误(而不仅仅是一个错字).我宁愿再等两个月才能获得修订版.他最好把胡子长出来. (18认同)

Ali*_*Ali 20

正如其他人已经指出的那样,这是书中的一个错字.然而,书中的意思是 我们必须写

std::operator<<(std::cout, "Hello, world").operator<<(std::endl);
Run Code Online (Sandbox Code Playgroud)

没有ADL.这就是Bjarne的冗长意味着什么.


我纠正了.正如Lachlan Easton所指出的那样,这不是一个错字,而是书中的一个错误.我无法访问这本书,这就是为什么我无法阅读该段并自己实现的原因.我已经向Bjarne报告了这个错误,以便他能够纠正它.


滑稽.同样的例子是维基百科

注意,这std::endl是一个函数,但它需要完全限定,因为它被用作参数operator<<(std::endl是函数指针,而不是函数调用).

毫无疑问,这本书是一个错误.然而,该示例 std::operator<<(std::cout, "Hello, world").operator<<(std::endl);显示了ADL如何帮助减少冗长.


由于gx_指出我的错误.


Lig*_*ica 10

提示的名称是"参数依赖查找".

它是不合格的函数名称,该作品查找依赖论点.

它有没有关系查找参数.

Bjarne misspoke.


Bor*_*der 8

我没有这本书,但这似乎是书中的一个错误,它缺少名称空间限定符这一事实与ADL无关.它应该是std::endl.

  • 是的,真的,我误解了所有语句(使用`std :: cout`)他在谈论搜索`operator <<,而不是`endl`. (2认同)