2010-07-02 34 views
9

我经常发现自己想要一种方法来撤销using语句的效果,或者包含所有的命名空间(比如std),但是排除一个要被替换的位(比如cout)。出于某种原因,这是不可能的。我想知道是否有人知道为什么决定不将这种能力添加到语言中?有一些技术原因吗?我认为它不仅仅被遗忘了,因为它似乎不适用于C++ 0x。为什么没有办法在C++中撤消“使用”?

只是为了澄清,我不是在寻找解决办法,因为谷歌可以告诉我这些。我正在寻找一个解释为什么这是不可能的,以及为什么它没有考虑(据我所知)包含在0x。

+2

我想提醒你,'使用namespace'指令通常被认为是一个非常糟糕的主意,你可以完全使用一个'using'指令,每个经常使用的名字......坦率地说,我通常不打扰,只是拼写命名空间(什么是5个以上的字符?) – 2010-07-02 06:58:35

+0

澄清:您不希望在文件稍后的某一点撤消使用声明的效果;你想指定符号作为使用声明本身的一部分从输入中排除?我发现你在这里选择的词语很混乱。 – 2010-07-02 07:48:27

+0

@msteam:您是否意识到可以不仅在文件范围内编写'using'指令,而且还在函数或嵌套块中编写'using'指令? – fredoverflow 2010-07-02 09:59:42

回答

11

一个使用指令带来的姓名或名称设置成一个给定的范围内声明。

你不能“未使用”出于同样的原因,你不能说

int x = 42; 
// and later 
[remove name x somehow] 

有没有办法在C都从范围unintroduce名称++,无论在哪里这些名字是从哪里来的。

鉴于它会过度复杂的名称查找(因为名称既可以添加也可以从范围中删除),除非有非常引人注目的用例,否则它不太可能被视为潜在的语言功能。

+4

另外,你不会首先使用''''如果你不希望它适用于整个范围。如果您只在少数地方需要它,则可以手动为每个匹配项加上名称空间的前缀。 – casablanca 2010-07-02 05:14:09

+0

有一个很好的技术原因,不允许您删除或替换作用域中的名称:链接。命名空间:: x的破坏形式只能引用单个地址。但是,这不适用于名称空间被拉入名称空间的名称,因为名称空间仍然会被修改。 它不会使查找复杂化。如果像“使用命名空间标准除了(cout,cerr);”是可能的(正如其他一些langs),这些名称永远不会在当前命名空间中,因此它们不必被删除。 – mstearn 2010-07-02 05:48:38

+0

@mstearn:使用指令与链接完全没有关系;它们只影响名称查找。它们实际上并没有将某些东西(函数或对象)添加到声明性作用域中,而只是让它们看起来好像处于该声明性作用域中一样。无论如何,这确实不是一个很好的用例,这意味着它没有真正的机会被认为是一种潜在的语言功能(尽管,谁知道:不知何故'std :: error_code'使它成为C + + 0x,IMO确实不是一个特别好的用例,至少不是它的实现方式)。 – 2010-07-02 05:59:44

1

主要是因为那里有变通办法非常简单直接,实际上通过为该特定目的包含“特性”而不会获得任何结果。虽然我不确定他是否直接陈述它,但我认为你可以争辩说,C++设计中的一个准则一直是将一般机制用于特殊用途,所以使用现有的示波器系统(例如)比添加一些特殊的方法从引入后从作用域中删除某些东西更有意义。

2

这是因为使用指令并不意味着被用于本机C++代码。它旨在帮助将C代码迁移到C++。在这种情况下,“不使用”是没有意义的。

CNC中 我本来应该更具体。在这种特殊情况下,它看起来像mstearn正在使用using指令来全局包含std名称空间。这样做通常是一个坏主意,因为它会导致全局名称空间污染,并且只能在某些情况下完成,例如从另一种语言转换到C++。

还有其他一些情况,其中利用使用指令的是精细(功能,命名空间组合物内)。然而,“不使用”在这些情况下也没有意义。

+1

我不确定这是什么意思。也许你可以澄清你的意思_“使用指令_并不意味着被用于...? – 2010-07-02 12:43:45

+0

@James McNellis好的电话(+1) – aCuria 2010-07-05 15:26:01

+0

@James McNellis没有什么好的理由做”使用std,cout“而不是而不是“std :: cout”,而不是现有的代码,可能会按照新的用法进行分类,并且你可能想要在命名空间中进行换行 – 2010-07-05 15:37:05

相关问题