Разрешение неоднозначности - PullRequest
3 голосов
/ 04 ноября 2010
void S(){}
struct S{};

int main(){
   S();
}

В приведенном выше коде выражение 'S ()' в main обрабатывается как выражение вызова функции, а не как попытка создать временный объект типа 'S'.

Какая частьСтандарт C ++ говорит о разрешении такого выражения в пользу объявления функции?По какой-то причине я не могу найти его.

Ответы [ 2 ]

5 голосов
/ 04 ноября 2010

Раздел 3.3.7 / 2

Имя класса (9.1) или имя перечисления (7.2) можно скрыть по имени объекта, функции или перечислителязаявлено в том же объеме. Если имя класса или перечисления и объект, функция или перечислитель объявляются в одной и той же области (в любом порядке) с одинаковым именем, имя класса или перечисления скрывается везде, где имя объекта, функции или перечислителяvisible .

Тогда вам необходимо использовать разработанный спецификатор типа в таких случаях

3.4.4 / 1 Разработанный спецификатор типа

Разработанный спецификатор типа может использоваться для ссылки на ранее объявленное имя класса или enum-name, даже если имя было скрыто объявлением не-типа (3.3.7). Имя класса или enum-name в разработанном спецификаторе типа может быть либо простым идентификатором, либо квалифицированным идентификатором.

0 голосов
/ 30 марта 2017

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

...