Вы не можете. В качестве выражения c2
является lvalue типа C
, точно так же, как c1
, поэтому в обоих случаях поиск, зависящий от аргумента, выберет foo<C>
.
Вы получаете тот же результат , используя Boost.TypeTraits.
Возможно, в C ++ 11 появятся новые волшебства, но (a) я недостаточно знаю о C ++ 11, чтобы ответить, и (b) вы все равно отметили вопрос C ++ 03 .