2016-11-11 5 views
0

Это может быть глупый вопрос.
Я заметил, что мы используем оператор разрешения области видимости :: как для пространства имен, так и для статической функции-члена.Оценка оператора разрешения области

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

2) MyClass::foo();

Вот мои вопросы:
1. Как может компилятор C++ отличающих их?
2. Что представляет собой процесс компилятора C++, когда он видит оператор разрешения области видимости?

+1

Для вашего первого вопроса, в примерах, которые вы показываете, речь идет о контексте. Ваш второй вопрос - это способ, чтобы объяснить здесь на SO, и будет трудно сделать с кем-либо, не зная о том, как работают компиляторы. –

+0

Есть ли случай, когда мы используем функцию класса без создания экземпляра объекта как java? –

+0

Только функции 'static'. –

ответ

2

окровавленные детали в 3.4.3 Квалифицированный поиск имен из спецификации C++ (с 3.3.1 декларативных регионов и прицелы и 5.1.1 (Первичные выражения) Общие также обеспечивая некоторую полезную информацию.)

кипятить его, хотя оба пространства имен и классы «декларативные регионы», так что в вашем примере, std::cout относится к имени cout в декларативной области под названием std и MyClass::foo относится к имени foo в декларативной области назван MyClass. Что касается оператора ::, то пространства имен и классы являются «тем же самым видом».

Кроме того, поскольку имена должны быть уникальными в пределах декларативной области (включая глобальное пространство имен), следующий код неверен:

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

Другими словами, нет никакой неоднозначности между test::x со ссылкой на х в пространстве имен или в классе x.

+0

Это то, что я искал. Спасибо. –

Смежные вопросы