Из cppreference :
В выражении запятой E1, E2 выражение E1 оценивается, его результат отбрасывается (хотя, если оно имеет тип класса, оно выиграет 'не может быть уничтожено до конца содержащего полного выражения), и его побочные эффекты завершаются до начала вычисления выражения E2 (обратите внимание, что пользовательский оператор не может гарантировать последовательность) (до C ++ 17).
Результат левого операнда отбрасывается.Однако, если вы рассмотрите operator precedence
, где оператор запятой всегда последний, то
std::cout << "Hello ", "Mars";
совпадает с
(std::cout << "Hello ") , ( "Mars" ) ;
, и компиляторпытаясь быть умным.Это
std::cout << "Hello "
действительно имеет эффект, даже если вы игнорируете возвращаемое значение.Обратите внимание, что operator<<
возвращает ссылку на поток, и вы обычно игнорируете это значение.Следовательно, отказ от оператора через запятую не мешает ему что-то напечатать на экране.
С другой стороны,
"Mars";
как утверждение не имеет никакого эффекта, и это то, что компилятор пытается сказать в этом случае.