C++ - сложный язык. Язык умеет много. Но те возможности, которые в нем реализованы, добавлялись постепенно, и вряд ли у разработчиков стандарта изначально был план создать язык таким, каким он является сейчас.
Следствием сложности языка является наличие большого числа семантических правил, которые часто вводят в ступор не очень опытных (да и опытных тоже) программистов.
Например, пусть есть следующий код:
<<
class A
{
public:
void foo(double i);
private:
void foo(int i);
};
int main()
{
A a;
a.foo(21);
}
>>
Скомпилируется ли данная программа? Нет. И это вряд ли то поведение, которое ожидает программист. Ведь у класса A есть публичный метод A::foo(double), а число 21 может быть неявно приведено к типу double. Так что ожидаемое поведение - вызов метода A::foo(double).
Однако программа не компилируется, и это происходит потому, что сначала происходит разрешение вызова функции (определяется наиболее подходящий кандидат из множества перегрузок), а после этого найденный кандидат проверяется на доступность (проверяется спецификатор доступа). И проблема в том, что метод A::foo(int) участвует в перегрузке, несмотря на то что является приватным. Для вызова a.foo(21) данный метод является лучшим выбором, но оказывается, что он недоступен. Поэтому код не компилируется.
Да, на C++ пишут явно не те, кто ищет легкий путь :)
1 минута
14 августа 2023