【发布时间】:2022-01-19 07:22:24
【问题描述】:
我正在阅读其他人的一些代码sn-ps,我发现了一行:
using namespace::std;
我怀疑它的目的是using namespace std;,有一些错别字。但令我惊讶的是,编译器毫无怨言地接受了这段代码。我用:
$ g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0
$ /usr/bin/g++ ${SRC} -std=c++11 -pthread -Wall -Wno-deprecated -o ${OUT}
我想知道为什么这段代码有效,它会产生什么影响?我怀疑这是一种不好的做法。
【问题讨论】:
-
你能在一些实际编译的代码的上下文中展示这个吗?
-
您可以使用
::表示某些内容来自全局命名空间。::std表示std嵌套在全局命名空间中,就这么简单。 -
@UlrichEckhardt 我希望在
namespace和::之间有一个空格,所以这种混淆是有道理的。 -
Related: link to cppreference: Qualified name lookup "如果 :: 左侧没有任何内容,则查找仅考虑在全局命名空间范围内(或引入使用声明的全局命名空间)。这使得即使它们被本地声明隐藏,也可以引用这些名称:"
-
我也会使用空格,@Raildex。但是,这里没有必要。在“使用命名空间”中是必要的,因为没有空格,它会变成一个符号/令牌。
::不是前一个令牌的一部分,因此不需要分隔符。此外,出于同样的原因,“::std”中不需要空格。
标签: c++ namespaces using-directives