我经常发现自己想要一种方法来撤消using语句的效果或包含所有命名空间(例如std)但排除一些要替换的位(例如cout)。出于某种原因,这是不可能的。我想知道是否有人知道为什么决定不将这种能力添加到语言中?有一些技术原因吗?我认为它不仅仅是被遗忘,因为它似乎也不适用于C ++ 0x。
只是为了澄清,我不是在寻找解决方法,因为谷歌可以向我展示这些。我正在寻找为什么这是不可能的解释,以及为什么不考虑(据我所知)包含在0x中。
答案 0 :(得分:11)
using指令将一个名称或一组名称带入给定的声明范围。
出于与你不能说的相同的原因,你不能“取消使用”
int x = 42;
// and later
[remove name x somehow]
在C ++中根本无法从作用域中引入名称,无论这些名称来自何处。
鉴于它会使名称查找过于复杂(因为名称可以在作用域中添加和删除),除非有一个非常引人注目的用例,否则它不太可能被视为潜在的语言功能。
答案 1 :(得分:2)
这是因为using指令不适用于本机C ++代码。它旨在帮助将C代码迁移到C ++。在这种情况下,“不使用”没有意义。
CNC中 我应该更具体一点。在这种特殊情况下,看起来mstearn正在使用using指令全局包含std命名空间。这样做通常是一个坏主意,因为它会导致全局命名空间污染,并且只能在某些情况下完成,例如从另一种语言转换到C ++。
在其他情况下,使用using指令很好(在函数,命名空间组合中)。然而,在这些情况下,“不使用”也没有意义。
答案 2 :(得分:1)
主要是因为是变通方法,这些变通方法足够简单明了,实际上没有任何东西可以通过为特定目的包含“特性”来获得。虽然我不确定他是否直接说过它,但我认为你可以说C ++设计中的一个指导原则一直是偏向一般机制而不是特殊目的机制,所以使用现有的范围系统(例如)比引入范围之后添加一些特殊方法更有意义。