Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ const的奇怪用法-为什么要编译?_C++_Gcc - Fatal编程技术网

C++ const的奇怪用法-为什么要编译?

C++ const的奇怪用法-为什么要编译?,c++,gcc,C++,Gcc,我最近在查看的一些代码中发现了以下函数定义: void func( const::std::string& str ) { // Do something... } 我很惊讶const::std::string似乎是合法的(它是用GCC4.4、GCC4.8、clang3.2和intel13.0.1编译的) 标准是否规定const可以用作命名空间?它被解析为 const ::std::string& str 其中::std::string是引用std::string的有

我最近在查看的一些代码中发现了以下函数定义:

void func( const::std::string& str )
{
    // Do something...
}
我很惊讶
const::std::string
似乎是合法的(它是用GCC4.4、GCC4.8、clang3.2和intel13.0.1编译的)

标准是否规定
const
可以用作
命名空间

它被解析为

const ::std::string& str
其中
::std::string
是引用
std::string
的有效方法

标准是否指定const可以用作名称空间

不,不可能,因为不可能

您的代码与以下代码相同:

void func( const ::std::string& str );

第一个作用域解析运算符表示全局名称空间。

之所以编译,是因为语法的计算结果为:

void func( const ::std::string& str )

这意味着
std
在全局范围内声明。在这种情况下,在
std
之前多加一个
::
是多余的。

你确定,它不是
const::std::string…
(注意空格)?@KirilKirov,空格有什么区别?标记的顺序是相同的,有或没有空格。@JamesKanze:这是空格运算符。哦,晚了一天。但不管怎样,如果你在复习。。。我还是会要求改变的
::std::string const&
会好得多,而且前面的
也不是真正的习惯用法---我们假设(希望)在标准库之外不会有任何符号
std
,这可能需要消歧。@Alf不要笑。我最近一直在使用Mathematica,在Mathematica中,空间是一个操作符。(这是写乘法的一种方式。)“在这种情况下”?我们对上下文了解多少。也许这是在类似于
名称空间矿{namespace std{…}
的地方。(我认为不太可能。任何用名称
std
定义嵌套命名空间的程序员都应该被枪毙。)@JamesKanze,“在这种情况下”。。。我使用这些词是因为,很明显,代码将包含一个
#include
,并且代码编译良好。因此,这里不需要显式的全局范围
。我们可以在任何其他名称空间中嵌套
std
,但在这种情况下,代码将不会编译(除非
使用名称空间Mine;
)。