首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >它是否是非标准的std::pair实现、编译器错误或非标准代码?

它是否是非标准的std::pair实现、编译器错误或非标准代码?
EN

Stack Overflow用户
提问于 2011-05-06 15:42:09
回答 3查看 1.1K关注 0票数 8

以下代码在VS2005和gcc-4.3.4上编译。

代码语言:javascript
复制
#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上编译,并显示以下错误消息:

代码语言:javascript
复制
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

据我了解,在微软的VS2010实现中,Pr::first实际上是_Pair_base的一员。然而,AFAIK,这无关紧要。&Pr::first仍必须是int Pr::*类型。请注意,以下代码可以很好地编译:

代码语言:javascript
复制
int Pr::* x = &Pr::first;

那么,它是否是非标准的std::pair实现、编译器错误或非标准代码?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-06 16:00:54

该标准对C++03和C++11中的配对提供了清晰的定义,该配对包含两个成员属性,并提供了配对的确切代码。我会认为这种行为(将成员移动到基类)违反了合同,因为根据标准,您的代码是有效的,并且它被实现拒绝了。

因此,在这种情况下,VC2010的实现并不符合标准。

票数 8
EN

Stack Overflow用户

发布于 2011-05-06 15:48:50

该标准不允许在匹配模板参数时进行任何转换(查找标准段落,将在中进行编辑)。

代码语言:javascript
复制
typedef std::pair<int,int> Pr;
X<Pr, int, &Pr::first> var;

这将X实例化为(为简洁起见,省略了std::)

代码语言:javascript
复制
X<pair<int,int>, int, int pair<int,int>::*>

但是&Pr::first的静态类型是

代码语言:javascript
复制
int _Pair_base<int,int>::*

因此,编译器需要执行如错误中所示的转换。我不知道gcc到底是如何实现std::pair的,但它似乎没有继承。我会查一查,再编辑一遍。

票数 4
EN

Stack Overflow用户

发布于 2011-05-08 15:13:24

是的,这是个bug。在以下位置找到错误报告:

http://connect.microsoft.com/VisualStudio/feedback/details/558993/std-pair-members-are-not-members-of-std-pair

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5908278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档