2013-04-03 9 views
9

私は最近、私が検討したいくつかのコードに次の関数の定義が見つかりました:constの奇妙な使い方 - これはなぜコンパイルされますか?

void func(const::std::string& str) 
{ 
    // Do something... 
} 

私は、それはGCC4.4でコンパイル(GCC 4.8 const::std::stringが合法であるように思われることを驚いて、クラン3.2 &インテル13.0。 1)。

標準でconstnamespaceとして使用できると指定していますか?

+3

本当に、それは 'const :: std :: string ...'(スペースに注意してください)ではありませんか? –

+0

@KirilKirovそして、スペースはどのような違いがありますか?トークンの順序は、空間の有無にかかわらず、黙示的です。 –

+0

@JamesKanze:それはスペース演算子です。ああ、ある日遅く。とにかく。 –

答えて

15

標準でconstを名前空間として使用できると指定していますか?

いいえ、できません。

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

最初のスコープ解決演算子がグローバル名前空間を表し:

あなたのコードは同じです。 stdはグローバルスコープで宣言されていることを意味

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

:構文があると評価されているため

+1

C++パーサが*多少の大文字と小文字を区別するのに驚くかもしれません... –

6

それは

::std::stringstd::stringを参照するための有効な方法です
const ::std::string& str 

として解析されます。

4

はこれがコンパイルされます。この文脈では、::の前には、stdが余分に記載されています。

+1

"この文脈で"?文脈について私たちは何を知っていますか?たぶんこれは 'namespace mine {namespace std {...}}'のようなものです。 (そうは思わないかもしれない。そして、 'std'という名前でネストされた名前空間を定義しているプログラマーは誰でも撮影することができます。 –

+0

@JamesKanze、" this context "...これらの言葉は、コードには#include 'コードがコンパイルされています。ですから、明示的なグローバルスコープ '::'は必要ありません。他の名前空間の中に 'std'を入れ子にすることはできますが、その場合はコードはコンパイルされません(' using namespace Mine; ')。 – iammilind

関連する問題