ну через | задавать в общем случае эт такое себе. а только для тернарника это делать с зависимостью от итогового это какие то костыли. тогда уж можно запретить прямой вывод типов для такого вида выражений (или сделать его непрямым).
AutoCoW как например в Swift — однозначно. Это совершенно непредсказуемое поведение компилятора, когда он везде и всегда заворачивает всё в CoW, за исключением ситуаций когда не заворачивает. Это полностью ломает мутабельность, ибо много непредсказуемых ситуаций, меняющихся от версии к версии реализации компилятора.
Вы что-то путаете, там cow явный через функцию isKnownUniquelyReferenced которая внутри просто смотрит на счетчик сильных ссылок. Cow явно обозначен в стд либе и есть только у трех коллекций в ней. А у просто структур и даже циклических indirect enum никакого встроенного cow нет. Это если мы говорим о cow как о термине который вводят авторы swift.
Если вы про ситуацию при копировании обычных структур, то там оптимизация копии не часть семантики и закладываться на это не нужно. А если нужно явно убрать копии у value типов, то нужно использовать consume и inout/borrowing/consuming
Вы же понимаете, что это костыль, появившийся, кстати, позже чем вот это неявное копирование всего.
Если что, я не апологет Очевидности и чаще многих употребляю RTFM, но эту непредсказуемую навязываемую неявность (далеко не только в Свифте) не могу назвать адекватной, рациональной и часто управляемой.
Пример помню... Есть значение типа Опшнл КакаятоСтруктура. Нужно прям тут изменить значение одного из полей структуры. Очевидный struct?.field = 11 вариант, на сколько помню, приводит к копированию на матчинге внутри сахара и новое значение пишется в копию, которая сразу и удаляется.