Например, функция:
int pr()
{
std::cout<<"test"<<std::endl;
return 0;
}
Эта функция имеет тип возврата int. Почему мы можем написать эту функцию в Main, не присваивая ничего. например
int main()
{
int i = pr(); // all right.
pr(); // but why is this correct also?
// is this similar void function this moment?
}
Потому что стандарт говорит так. На многих языках ошибка при использовании возвращаемого значения будет ошибкой. По разным историческим причинам это не относится к C или C++; вы можете игнорировать возвращаемое значение.
На уровне реализации: int
обычно возвращается в регистр; если вы игнорируете возвращаемое значение, компилятор ничего не делает с этим регистром. Однако для типов классов вызывающий должен уничтожить возвращаемое значение, даже если он игнорирует его.
Он просто выполняет функцию, и возвращаемое значение теряется, оно не назначается нигде, игнорируется.
Это разрешено, потому что это не запрещено. Там может быть ситуация, когда вы заботитесь только о логике, и вы действительно не хотите использовать возвращаемое значение, которое указывает на то, что не важно для вашей текущей задачи. Например:
int openFiles(string directory) {
//opens files on directory and returns the number
//of files that were successfully opened
}
Меня может не интересовать возвращаемый тип.
В C/C++ функция может выбрать свой тип возврата как пустой или определенный тип. Однако, если non-void является возвращаемым типом функции, всякий раз, когда вызывается функция, вызывающий может использовать или не использовать возвращаемое значение. Это не обязательно означает, что это эквивалентно типу возврата void. У вас есть возможность проверить возвращаемое значение, но вам не нужно проверять это, до вас, необязательно. Надеюсь, что ответит.