C++ 类中'typedef' 会自动继承吗?

2024-04-06

我曾经认为'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;
}

输出是“true true true false”。 但在我看来,‘has_typedef_X<B>::value给出“true”意味着在结构体 B 中,X 是“typedef”的。

那么,如果有人可以解释这个问题或纠正我?

在线版本可在http://melpon.org/wandbox/permlink/iwZ6eZ3PoBPgyFBj http://melpon.org/wandbox/permlink/iwZ6eZ3PoBPgyFBj[网址已更正]


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

我发现的与此相关的最相关的标准引用是:

[类.嵌套.类型] §1 http://eel.is/c++draft/class.nested.type#1

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

[类.成员.查找] §9 http://eel.is/c++draft/class.member.lookup#9

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 类中'typedef' 会自动继承吗? 的相关文章

随机推荐