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