Следующий код компилируется на VS2005 и gcc-4.3.4 .
#include <algorithm>
#include <iostream>
template<class C, class T, T C::*x>
struct X { };
typedef std::pair<int,int> Pr;
X<Pr, int, &Pr::first> var;
int main()
{
std::cout << "hello\n";
}
Но он не скомпилируется на VS2010 с сообщением об ошибке:
1>d:\a\testvs10\testvs10.cpp(13): error C2440: 'specialization' : cannot convert from 'int std::_Pair_base<_Ty1,_Ty2>::* ' to 'int std::pair<_Ty1,_Ty2>::* '
1> with
1> [
1> _Ty1=int,
1> _Ty2=int
1> ]
1> Standard conversion from pointer-to-member of base to pointer-to-member of derived is not applied for template arguments
Я понимаю, что в реализации Microsoft VS2010 Pr::first
на самом деле является членом _Pair_base
. Однако, AFAIK, это не имеет значения. &Pr::first
все еще должен иметь тип int Pr::*
. Обратите внимание, что следующий код компилируется нормально:
int Pr::* x = &Pr::first;
Итак, это нестандартная реализация std :: pair, ошибка компилятора или нестандартный код?