Вызывается функция с выражением "cout" внутри оператора "cout"
Я столкнулся с этим довольно расплывчатым поведением, когда возился с кодом, вот пример:
#include <iostream>
using namespace std;
int print(void);
int main(void)
{
cout << "The Lucky " << print() << endl; //This line
return 0;
}
int print(void)
{
cout << "No : ";
return 3;
}
В моем коде утверждение с комментарием //This line
предполагается распечатать
The Lucky No : 3
, но вместо этого он был напечатан No : The Lucky 3
. Что вызывает такое поведение? Связано ли это с стандартом С++ или его поведение варьируется от одного компилятора к другому?
Ответы
Ответ 1
Порядок оценки аргументов функции не указан. Ваша строка выглядит следующим образом:
operator<<(operator<<(operator<<(cout, "The Lucky "), print()), endl);
Первичным вызовом в выражении является аргумент endl в качестве аргумента. Неизвестно, будет ли сначала оцениваться второй аргумент, endl, или большее суб-выражение:
operator<<(operator<<(cout, "The Lucky "), print())
И сломав это, не указано, вызывается ли сначала функция print()
, либо под-выражение:
operator<<(cout, "The Lucky ")
Итак, чтобы ответить на ваш вопрос:
Что вызывает такое поведение? Связано ли это с стандартом С++ или его поведение варьируется от одного компилятора к другому?
Он может варьироваться от компилятора к компилятору.
Ответ 2
Позвоните по operator <<
просто operator
.
Теперь мы можем написать
cout << "The Lucky"
как
operator(cout, "The Lucky")
Результатом этой операции является cout
, и она передается в следующий <<
, поэтому мы можем написать
operator(operator(cout, "The Lucky"), print() )
Это вызов функции с двумя параметрами, и стандарт ничего не говорит о порядке их оценки.
Итак, с некоторыми компиляторами вы действительно можете получить
The Lucky No : 3
Ответ 3
В моем компиляторе No: Lucky 3 - это выход... это означает, что его поведение варьируется от компилятора к компилятору.