Интересно, что когда я компилирую ваш код (Visual C ++ 10 Express), я получаю ошибки, но также и при попытке выполнить этот более простой случай:
int main(int argc, char* argv[])
{
C<int> x; // OK
C<const int> x1; // error C2535: 'void C<T>::f(T &)' : member function
// already defined or declared
return 0;
}
Похоже, что сворачивание ref-to-ref, определенное в упомянутом вами DR, означает, что const
ref становится простым неконстантным ref в шаблоне. Моя проблема в том, что я не понимаю, почему второй f
не просто игнорируется.
Если я поменяю C так, чтобы второй f был const
-качественным, это теперь скомпилирует:
template <typename T>
struct C {
void f(T&) { }
void f(const T& t) const {}
};
Подразумевается, что, когда C
создается с const
что-либо (ссылка или нет), две перегрузки C::f
просто идентичны и приводят к обнаружению дубликатов во время компиляции.
Возможно, кто-нибудь умнее меня сможет расшифровать цепочку здесь.
РЕДАКТИРОВАТЬ: Если подумать, то неудивительно, что T = const int&
приводит к тому, что перегрузки f
идентично создаются как
void f(const int&) {}
Вот что говорит мне компилятор:
#include "stdafx.h"
template <typename T>
struct C {
void f(T&) { }
void f(const T&) { }
};
int main() {
C<const int&> z; // compile error: f cannot be overloaded
return 0;
}
выдает эту ошибку:
1>test.cpp(6): error C2535: 'void C<T>::f(T)' : member function already
defined or declared
1> with
1> [
1> T=const int &
1> ]
1> test.cpp(5) : see declaration of 'C<T>::f'
1> with
1> [
1> T=const int &
1> ]
1> test.cpp(10) : see reference to class template instantiation
'C<T>' being compiled
1> with
1> [
1> T=const int &
1> ]
Я даже не уверен, что это как-то связано с ДР.