Почему tellg() неявно приводится к int при инициализации int, но не может быть сложенным с int?

Функция tellg() в C++ возвращает значение текущей позиции в потоке ввода, выраженное в типе streampos. streampos - это тип, предназначенный для представления позиции в потоке данных, определенный в стандартной библиотеке std::fstream.

Когда мы пытаемся инициализировать переменную типа int значением, возвращаемым функцией tellg(), происходит неявное преобразование типа данных. Такое преобразование возможно, потому что существует стандартное преобразование типов, которое позволяет неявно привести значение streampos к типу int, если такое преобразование не потеряет информации.

Однако, при попытке сложить значения типа streampos и int, компилятор C++ не выполнит неявное преобразование, так как в этом случае возможна потеря информации. Сумма двух значений типа streampos может выйти за границы диапазона значений, который может быть представлен типом int. Примерно такая же ситуация, как при попытке сложить int и unsigned int, компилятор выдаст ошибку.

Если вы хотите сложить значения типа streampos и int, вам нужно выполнить приведение типов явно, чтобы обозначить, что вы осознанно намерены произвести преобразование, возможно, с потерей информации. Например:

std::fstream file("example.txt");

// Получаем текущую позицию в файле
std::streampos pos = file.tellg();

// Преобразуем streampos к int
int intPos = static_cast<int>(pos);

// Сложение streampos и int
pos = static_cast<std::streampos>(intPos + 10);

В данном примере мы использовали static_cast для приведения значения типа streampos к типу int и, наоборот, типа int к типу streampos. Это позволяет явно указать, что мы осознанно производим преобразование.