Код компилируется в Visual Studio 2010, но не должен компилироваться вообще - PullRequest
5 голосов
/ 22 марта 2012

Следующий исходный код правильно компилируется с Visual Studio 2010:

namespace NS
   {
   class X
      {
      };   
   X Y(X str);
   } 

void myFun()
   {
   NS::X x;
   Y(x);
   }

(это сокращенный код, где все мои собственные имена классов и функций были заменены на X, Y, ...)

Я ожидаю, что строка Y(x) не будет скомпилирована, поскольку она должна быть NS::Y(x).

Этот исходный код скомпилирован с помощью следующей команды

cl /c file.cpp

Здесь нет других файлов и других параметров командной строки.

Почему этот файл компилируется? Ошибка в VS2010? Или что-то, что я (и мои 3 других коллеги) упустили из виду?

Ответы [ 2 ]

9 голосов
/ 22 марта 2012

То, что вы испытываете, связано с ADL ( Аргумент-зависимый поиск ).

В вашем фрагменте нет ничего плохого (кроме того, что компоновщик, вероятно, будет жаловаться на NS::Y, не определен), но он должен скомпилироваться - VS2012 обрабатывает фрагмент как следует.

Компилятор найдет NS::Y из-за того, что тип параметра x (NS::X) находится в соответствующей области видимости.


3.4.2 Поиск имени в зависимости от аргумента [ basic.lookup.argdep ]

  1. Когда неквалифицированное имя используется в качестве постфиксного выражения в вызов функции (5.2.2), другие пространства имен, не учитываемые во время обычный неквалифицированный поиск (3.4.1) можно искать, и в тех пространства имен, объявления дружественных функций в области имен (11.4) не в противном случае видимый может быть найден.

    Эти модификации поиска зависят от типов аргументы (и для аргументов шаблона шаблона, пространство имен аргумент шаблона).

  2. Для каждого типа аргумента T в вызове функции существует набор из нуля или более связанных пространств имен и набор из нуля или более связанные классы для рассмотрения.

    Наборы пространств имен и классы целиком определяются типами аргументов функции (и пространство имен любого аргумента шаблона).

3 голосов
/ 22 марта 2012

Это действительный код C ++. Он компилируется, поскольку аргумент-зависимый поиск применяется здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...