Для вашего Q
вы можете использовать обе функции преобразования.Вы можете сделать так, чтобы компилятор предпочел один другому, сделав один неконстантным.
operator T() const { return v; }
operator T&() { return v; }
Теперь для Q
берется operator T&
.Этот способ также исправит вызов на W
, чтобы получить неконстантную ссылку.Вы также можете вернуть константную ссылку из другого
operator T const&() const { return v; }
operator T&() { return v; }
Таким образом, вы все равно предпочтете вторую функцию преобразования для Q
, но если ваш объект a
является константным и вы инициализируете константную ссылку, выне всегда требуется копировать v
.