Если вы используете первый вариант (возвращающий void), было бы невозможно объединить присвоение в более сложное выражение. То есть следующая распространенная идиома:
if (my_x = get_value()) {
// do something when my_x evaluates to non-zero/non-null
}
будет невозможна для my_x
типа X
и оператора присваивания, возвращающего пустоту.
Если вы используете второй вариант , вы рискуете запустить копию X
. Это не так уж и страшно, поскольку в наши дни мы гарантировали Оптимизацию возвращаемого значения ; и копию обычно опускают еще дальше, но это все еще возможно. Для очень тяжелого X (например, длинного вектора) вы можете убедиться, что этого не произойдет. Возврат по значению также исключает объединение в некоторые сложные выражения, например
sort_in_place(x = get_values());