Представьте:
S f(S a) {
return a;
}
Почему нельзя использовать псевдоним a
и слот возвращаемого значения?
S s = f(t);
S s = t; // can't generally transform it to this :(
Спецификация не допускает это преобразование, если конструктор копирования S
имеет побочные эффекты. Вместо этого требуется как минимум две копии (одна от t
до a
, и один от a
до возвращаемого значения, а другой от возвращаемого значения до s
, и только последнее может быть опущено. Обратите внимание, что я написал = t
выше, чтобы представить факт копирования t
в f's a
, единственная копия, которая по-прежнему будет обязательной при наличии побочных эффектов конструктора перемещения / копирования. ).
Почему?