Находятся ли имена модулей в отдельном «пространстве имен», или они могут конфликтовать, например, с имена переменных? - PullRequest
3 голосов
/ 22 июня 2019

Я думаю / надеюсь, что имена модулей не будут совпадать, например, с именами переменных.Может ли кто-нибудь подтвердить это и, возможно, сослаться на подходящий раздел в (готовящемся) стандарте?

Файл: a_module.cc

export module a_module;
export int add(int a, int b) { return a + b; }

// Question-1: Is using 'a_module' below as variable name allowed, or does
// the 'export module a_module' above prevent us from using that name?
int a_module = 11;

Файл: main.cc

import a_module;

// Question-2: Is using 'a_module' below as variable name fine, or does the
// 'import a_module' above prevent us from using that name?
int a_module = 42;

int main() { return add(1, 2); }

1 Ответ

3 голосов
/ 22 июня 2019

Трудно назвать отрицание, но да - имена модулей не могут совпадать с именами немодульных.

У нас есть множество вариантов поиска имен в C ++, но ни один из них не учитывает имена модулей. Подобно выражению f(x);, можно найти множество вещей с именами f и x, и эти () могут даже означать разные вещи, но он никогда не сможет найти ни модуль с именем f или x. Именование модулей одним или другим или обоими не меняет поиск.

Аналогично, в преамбуле все module связанные операторы (import, export, объявления модулей или объявления разделов) только рассматривают имена модулей. Если у вас есть что-то вроде:

import M1;
import M2;

И M1 происходит с экспортом некоторого имени M2, которое не сломает последующие import из M2. Мы ищем, в частности, module s с именем M2.

Вам не нужно беспокоиться о столкновениях между этими двумя вещами.

...