Подтвердить что ты не робот

На объекте 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?

4b9b3361

Ответ 1

Из стандарта:

13.3.3 Если наилучшая жизнеспособная функция существует и уникальна, разрешение перегрузки преуспевает и приводит ее в результате. В противном случае разрешение перегрузки выходит из строя, а вызов плохо сформирован. При достижении разрешения перегрузки и самая эффективная функция недоступна (раздел 11) в том контексте, в котором она используется, программа плохо сформирован.

Ответ 2

Объект не const, поэтому перегрузка не const лучше соответствует. Разрешение перегрузки происходит до проверки доступа. Это гарантирует, что разрешение перегрузки не будет случайно изменено путем изменения доступа к функции-члену.