mav*_*rik 80 c++ argument-dependent-lookup c++11
我正在阅读C++编程语言,第4版(由Bjarne Stroustrup撰写)关于参数依赖查找.这是引用(26.3.6,Overaggressive ADL):
依赖于参数的查找(通常称为ADL)对于避免冗长非常有用(14.2.4).例如:
Run Code Online (Sandbox Code Playgroud)#include <iostream> int main() { std::cout << "Hello, world" << endl; // OK because of ADL }
如果没有依赖于参数的查找,则
endl
无法找到操纵器.实际上,编译器注意到第一个参数<<
是ostream
定义的std
.因此,寻找endl
在std
和发现它(中<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
.
Lac*_*ton 49
对于那些说它是拼写错误的人来说,事实并非如此.Bjarne犯了一个错误,或者编译器错了.OP发布的一段之后的段落
如果没有依赖于参数的查找,则无法找到endl操纵器.实际上,编译器注意到<<的第一个参数是在std中定义的ostream.因此,它在std中查找endl并找到它(in
<iostream>
).
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如何帮助减少冗长.
我没有这本书,但这似乎是书中的一个错误,它缺少名称空间限定符这一事实与ADL无关.它应该是std::endl
.
归档时间: |
|
查看次数: |
3382 次 |
最近记录: |