Вы всегда можете использовать специализацию шаблона для реализации другой версии для любого вида ссылки:
template <typename T> struct X {
void foo(T const&);
};
template <typename T> struct X<T&> {
void foo(T const&);
};
Теперь X<int>::foo
ожидает int const&
и X<int&>::foo
ожидает int const&
тоже.
Однако из вашего вопроса не совсем ясно, что именно вы пытаетесь сделать.
Редактировать: Моя версия g ++ (4.6.1) не жалуется без специализации на шаблон для следующего
int i = 7;
X<int&>(i);
В то время как это для
X<int&>(7);
Что является правильным IMO, потому что вы пытаетесь преобразовать временную (7
) в изменяемую ссылку (даже если это ссылка на константную ссылку).
Редактировать 2: Если вы хотите уменьшить дублирующийся код, не специализируйте свой исходный класс, а используйте это:
template <typename T> struct R {
typedef T& Ref;
typedef T const& ConstRef;
};
template <typename T> struct R<T&> {
typedef T& Ref;
typedef T const& ConstRef;
};
template<typename T> struct X {
void foo(typename R<T>::ConstRef x);
};