Представьте себе:
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 a
, единственной копии, которая все еще была бы обязательной при наличии побочных эффектов конструктора move/copy).
Почему это?