но по неизвестной причине Ref определяется без конст. Почему?
Ведущий const вводит в заблуждение. В типе Util<const V, const Ref>
вы const
квалифицируете тип Ref
. То есть, вы, вероятно, передаете V & const
как тип, а не V const &
. Хотя обычно V & const
было бы неправильно сформировано, при косвенной работе с типом, например, когда он является псевдонимом или аргументом шаблона, дополнительный квалификатор cv просто игнорируется.
Лично я бы использовал дополнительный Параметр шаблона для всей черты.
template<class V>
class VTrait {
public:
typedef V & reference;
typedef V const & const_reference;
};
template<class D, class V, class Trait = VTrait<V>>
class Base {
public:
class Inner1: public Util<const V, typename Trait::const_reference> {
// ...
};
// ...
};
Клиентскому коду, который хочет что-то отличное от вашей среды, потребуется только настроить Trait
.