1

я нашел то, что я считаю странное поведение в C++: а напечатанный оператор в частном базовом классе путает компилятор при попытке разрешить неявный бросок:напечатанный оператор в частной базе

#include <iostream> 
struct Base 
{ 
#ifdef ENABLE 
    operator bool() const { return true; } 
#endif 
}; 
struct Derived : private Base 
{ 
    operator int() const { return 7; } 
}; 
int main() 
{ 
    Derived o; 
    std::cout << o << '\n'; 
    return 0; 
} 

Без -DENABLE, код компилируется просто отлично, а выходы 7. С -DENABLE код больше не компилируется, жалуясь на неоднозначную перегрузку. Я попробовал gcc-4.6.5, и clang-3.3. Что вводит в заблуждение, так это то, что я явно не могу просить (bool)o, потому что Base является частным базой.

Ожидается ли такое поведение?

+6

Разрешение перегрузки происходит до того, как рассматривается управление доступом. – juanchopanza

+1

Так это указано в стандарте C++? Или это выбор компилятора? –

+0

Это стандарт. – juanchopanza

ответ

2

Контроль доступа всегда наступает последним. Цитата из стандарта:

10.2 Имя пользователя поиска [class.member.lookup]

1 Имя пользователя поиска определяет значение имени (ID-выражение) в области видимости класса (3.3 +0,7). Поиск имени может привести к двусмысленности в , в случае которого программа плохо сформирована. Для id-выражения, имя поиск начинается в области класса этого; для идентификатора с квалифицированным идентификатором, имя поиск начинается в области спецификатора nestedname. Поиск по имени происходит до контроля доступа (3.4, п. 11).

8 Если имя перегруженной функции однозначно найдено, то до контроля доступа также имеет место перегрузка (13.3) . Неоднозначность может быть разрешена путем присвоения имени классу .

Причина, оба оператор рассматриваются в том, что а) преобразовании базовой CL не скрыты от производных одного (которое было бы, если оба было конвертерным к тому же типу), б) и bool и int может быть записанный на stdout, c) ни один из них не лучше, чем другой, поэтому разрешение перегрузки дает двусмысленность. Это приводит к жесткой ошибке даже до того, как управление доступом вступит в игру.

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