《C++之旅》第二版中using-directive是否导致无法后续限定命名空间名称?
关于《C++之旅》第二版中using-directive引文的澄清
引文的真正含义
原文中“使用using-directive后,我们将失去选择性使用该命名空间中名称的能力”,并不是指无法通过命名空间限定符(如std::)访问名称,实际指向的是:
- 当当前作用域存在与命名空间内同名的标识符时,你无法再通过不加限定符的方式选择命名空间中的版本。
- 举个冲突场景的例子:
没有#include <iostream> using namespace std; void cout() { /* 局部同名函数 */ } int main() { // cout << "test\n"; // 编译错误:无法区分是局部的cout还是std::cout std::cout << "works\n"; // 依然可以正常使用限定符访问命名空间版本 }using namespace std;时,直接写cout会提示未定义,但你可以用std::cout明确指定命名空间的版本;而加了using-directive后,直接写cout会因同名冲突无法编译,此时你要么修改局部标识符的名字,要么只能用限定符调用——这就失去了“不加限定符时选择命名空间版本”的灵活性,也就是原文所说的“失去选择性使用的能力”。
你的测试代码为何正常运行
你的测试代码里没有任何与cout同名的局部标识符,所以无论是直接写cout还是std::cout,编译器都能正确解析为std::cout,这完全符合C++语法规则,和原文的表述并不矛盾。
勘误表相关确认
目前《C++之旅》第二版的官方勘误表中并未收录这段内容,说明原文的表述是准确的,只是需要结合上下文正确理解“选择性使用”的具体指向。
内容的提问来源于stack exchange,提问作者heretoinfinity
相关产品推荐
相关产品推荐

