我曾经认为'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(使用前将#替换为@)