На объекте nonconst, почему С++ не вызывает версию const для метода с перегрузками public-const и private-nonconst?
class C
{
public:
void foo() const {}
private:
void foo() {}
};
int main()
{
C c;
c.foo();
}
MSVC 2013 не нравится:
> error C2248: 'C::foo' : cannot access private member declared in class 'C'
Если я передал ссылку const
, она работает:
const_cast<C const &>(c).foo();
Почему я не могу вызвать метод const
для объекта const
?
Ответы
Ответ 1
Из стандарта:
13.3.3 Если наилучшая жизнеспособная функция существует и уникальна, разрешение перегрузки преуспевает и приводит ее в результате. В противном случае разрешение перегрузки выходит из строя, а вызов плохо сформирован. При достижении разрешения перегрузки и самая эффективная функция недоступна (раздел 11) в том контексте, в котором она используется, программа плохо сформирован.
Ответ 2
Объект не const
, поэтому перегрузка не const
лучше соответствует. Разрешение перегрузки происходит до проверки доступа. Это гарантирует, что разрешение перегрузки не будет случайно изменено путем изменения доступа к функции-члену.