Вызывается функция с выражением "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 - это выход... это означает, что его поведение варьируется от компилятора к компилятору.