a = b; // implicit conversion from const to volatile; okay?
То, что это "хорошо", зависит от типа T
.
. Здесь происходит преобразование lvalue-в-значение. Вот что говорят стандартные правила:
[conv.lval]
Glvalue нефункционального типа, не являющегося массивом T, может быть преобразовано в prvalue. Если T - неполный тип, программа, которая требует этого преобразования, плохо сформирована. Если T не тип класса, тип prvalue является cv-неквалифицированной версией T. В противном случае тип prvalue равен T.
Так, если, например, T
не является типом класса, тогда значение преобразования T const b
будет равно T
, что в данном случае совпадает с типом назначенной переменной. Таким образом, если T
присваивается (т. Е. Не является константой), то это "нормально".
Для типов классов, то, является ли присвоение "хорошо", зависит от того, какой тип оператора (ов) присваивания класс имеет. Оператор неявного присваивания не является энергозависимым, поэтому примерное присваивание будет , а не"в порядке". Это было бы плохо сформировано. Но можно сделать так, чтобы пользователь объявил изменчивый квалифицированный оператор присваивания, хотя это довольно редко.