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;
)。