MSVC中嵌套类型名称的冲突
我在使用可变参数模板时遇到了一个问题,但问题与可变参数模板无关,可以在没有它们的情况下进行重现。 问题与继承类和基类中的相同类型名称有关。
我已将代码简化为以下代码片段:
#include <typeinfo>
#include <iostream>
struct A
{
int member;
};
struct B: public A
{
typedef A NEXT;
short member;
};
struct Foo: public B
{
typedef B NEXT;
void Check()
{
std::cout << typeid(NEXT::member).name() << 'n';
std::cout << typeid(NEXT::NEXT::member).name() << 'n';
NEXT::NEXT::member = 1;
NEXT::member = 2;
std::cout << NEXT::NEXT::member << 'n';
std::cout << NEXT::member << 'n';
};
};
int main()
{
Foo foo;
foo.Check();
}
它编译时没有警告,可以与GCC和clang一起工作,但它会产生错误的MSVC输出(至少在Visual Studio 2015 Update 1中)。
看起来名称中发生了一些冲突,并且它将NEXT::NEXT::member
视为NEXT::member
,但在同一个地方,它的typeid
(以及std::is_same
)。
当用GCC或clang编译时,输出是:
s
i
1
2
但是在MSVC的情况下,输出是:
short
int
2
2
下面的代码编译没有警告与GCC或叮当声,但如预期产生与MSVC错误:
struct A
{
int member;
};
struct B: public A
{
typedef A NEXT;
short member;
};
struct Foo: public B
{
typedef B NEXT;
short& GetB() { return NEXT::member; };
int& GetA() { return NEXT::NEXT::member; };
};
MSVC错误:
source_file.cpp(18): error C2440: 'return': cannot convert from 'short' to 'int &'
上面的代码是否有效? 这是MSVC的问题还是我以某种方式利用UB?
更新
该问题无法在MSVC 2015更新3中重现。
链接地址: http://www.djcxy.com/p/72531.html上一篇: Collision of nested typenames in MSVC
下一篇: msvc std::function doesn't accept generic lambda with a nested lambda