简体   繁体   中英

Is it a non-standard std::pair implementation, a compiler bug, or a non-standard code?

The following code compiles on VS2005 and 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";
}

But it fails to compile on VS2010 with the error message:

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

I understand that in microsoft's implementation of VS2010 Pr::first is actually a member of _Pair_base . However, AFAIK, it doesn't matter. &Pr::first still must be of a type int Pr::* . Note that the following code compiles fine:

int Pr::* x = &Pr::first;

So, is it a non-standard std::pair implementation, a compiler bug, or a non-standard code?

The standard provides a clear definition of what a pair is, both in C++03 and C++11 the pair contains two member attributes, and provides exact code of what pair looks like. I would consider that behavior (moving the members to a base class) as a breach of contract as your code is valid according to the standard and it is being rejected by the implementation.

So the implementation of VC2010 is not standard conforming on this particular case.

The standard doesn't allow any conversion while matching the template parameters (looking for the standard paragraph, will edit in).

typedef std::pair<int,int> Pr;
X<Pr, int, &Pr::first> var;

This instatiates X as ( std:: omitted for brevity)

X<pair<int,int>, int, int pair<int,int>::*>

But the static type of &Pr::first is

int _Pair_base<int,int>::*

So the compiler would need to do a conversion like displayed in the error. I don't know exactly how gcc implements std::pair , but it seems to do so without inheritance. I'll look it up and edit again.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM