2016-11-11 15 views
0

これは愚かな質問かもしれません。
私は、名前空間と静的メンバー関数の両方にスコープ解決演算子::を使用していることに気付きました。ここでスコープ解決オペレーターの評価

1) std::printf("foo");

2) MyClass::foo();

は私の質問は以下のとおりです。
1.どのようにC++コンパイラはそれらを区別することができますか?
2.スコープ解決演算子を見たときのC++コンパイラの処理は何ですか?

+1

最初の質問では、例ではすべてがコンテキストに関するものです。あなたの2番目の質問は、ここでSOを説明するための方法であり、どのようにコンパイラが動作するかについての知識がなければ、誰にもするのは難しいでしょう。 –

+0

Javaのようなオブジェクトをインスタンス化せずにクラス関数を使用するケースはありますか? –

+0

'static'メンバ関数のみです。 –

答えて

2

血みどろの詳細は、C++仕様の3.4.3修飾名の検索である(3.3.1宣言地域やスコープ5.1.1(プライマリ表情で)一般はまた、いくつかの有用な情報を提供しています。)それを煮詰めるために

は、しかし、名前空間とクラスの両方が「宣言型の領域」であるので、あなたの例では、std::coutstdという名前の宣言型地域内の名前coutを参照し、MyClass::fooは宣言地域の名前fooを指し、 MyClassという名前です。 ::演算子に関する限り、名前空間とクラスは「同じ種類のもの」です。また

、名前は(グローバルネームスペースを含む)を宣言的領域内で一意でなければならないので、次のコードが無効である:すなわち

//invalid code - does not compile 
namespace test { int x; } 
class test { static int x; }; 

、Xを参照test::x間に曖昧さは存在しませんクラス内のネームスペースまたはx内に存在します。

+0

これは私が探していたものです。ありがとうございました。 –