2010-11-04 4 views
3
void S(){} 
struct S{}; 

int main(){ 
    S(); 
} 

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

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

ответ

5

Раздел 3.3.7/2

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

Затем вам нужно использовать уточненный спецификатор типа в таких случаях

3.4.4/1 уточненных спецификатор типа

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

+1

Да дружище Это одна Благодаря – Chubsdad

+0

@Chubsdad: ':)' –

0

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

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