'typedef'是否在C++类中自动继承?

Fen*_*ang 17 c++ c++11

我曾经认为'typedef'不会自动继承.但下面的代码表示不同的东西.

#include <iostream>
#include <type_traits>

struct A
{
    typedef int X;
};

struct A_ 
{
    typedef char X;
};

struct B : A {};
struct B_ : A, A_ {};

template< typename ... Ts >
using void_t = void;

template< typename T, typename = void >
struct has_typedef_X : std::false_type {};

template< typename T >
struct has_typedef_X< T, void_t<typename T::X> > : std::true_type {};

int main()
{
    std::cout << std::boolalpha;
    std::cout << has_typedef_X<A>::value << std::endl;
    std::cout << has_typedef_X<A_>::value << std::endl;
    std::cout << has_typedef_X<B>::value << std::endl;
    std::cout << has_typedef_X<B_>::value << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出为'true true true false'.但在我看来,' has_typedef_X<B>::value'给'真'意味着在结构B中,X是'typedef'.

所以,如果有人能解释这个问题或纠正我吗?

有关在线版本,请访问http://melpon.org/wandbox/permlink/iwZ6eZ3PoBPgyFBj [已更正网址]

eer*_*ika 10

父类的嵌套类型名称(即成员类型)在派生类的范围内是可见的,只要访问说明符不是私有的,就可以访问它们.如果来自不同基类的多个类型具有相同的名称,则非限定名称不明确.

我发现的最相关的标准报价是:

[class.nested.type]§1

类型名称遵循与其他名称完全相同的范围规则.[...]

[class.member.lookup]§9

[注意:即使对象具有多个类型为T的基类子对象,也可以明确地找到基类T中定义的静态成员,嵌套类型或枚举器.[...]

事实上,使用它的一个例子是标准,它指定标准容器的迭代器继承std::iterator模板,模板只包含嵌套的类型名称.继承的重点是将这些嵌套类型名称添加到迭代器中.(这个例子将在下一个标准版本(c ++ 17)中过时,std::iterator建议不再使用它.)