Как понять, чем отличаются две декларации - PullRequest
0 голосов
/ 03 мая 2020

Я просто как бы не понимаю предложение "если наборы объявлений S (f, B i) и S (f, C) различаются" в [class.member.lookup] раздел, чем отличаются объявления, за исключением того, что их типы различны, например, если два объявления объявлены одинаковым типом, но они объявлены в разных областях соответственно, то, отличаются ли эти два объявления? Например:

#include <iostream>
int main(){
  void func(int);  //#1
  {
      void func(int); //#2
  }
}

Итак, # 1 и # 2 - это разные объявления? Они имеют один и тот же тип, просто объявляются в разной области видимости. Если они различаются, где в кавычках в стандарте Internation это сказано?

1 Ответ

1 голос
/ 06 мая 2020

Текст, который вы цитируете, взят из [class.member.lookup], который применяется только для поиска имен в области действия класса (как описано в первом предложении раздела).

В вашем примере кода есть нет классов, поэтому этот раздел не применяется.

Этот код будет охватываться [basi c .link] / 9:

Два одинаковых имени (пункт 6 ) и которые объявляются в разных областях, должны обозначать одну и ту же переменную, функцию, тип, шаблон или пространство имен, если

  • оба имени имеют внешнюю связь или оба имени имеют внутреннюю связь и объявлены в одном и том же переводе единица измерения; и
  • оба имени относятся к членам одного и того же пространства имен или к членам, не по наследству, одного и того же класса; и
  • , когда оба имени обозначают функции, списки типов параметров функций идентичны; и
  • , когда оба имени обозначают шаблоны функций, подписи (17.5.6.1) одинаковы.

Все маркеры удовлетворены: обе ваши func имеют внешнюю связь, они оба являются членами глобального пространства имен, а функции имеют идентичные списки типов параметров и не являются шаблонами функций.

...