类型别名与类型同名

Joh*_*mph 6 c++ alias language-lawyer

它是有效的 C++ 吗?

#include <iostream>


class Test {

    struct Inner {
    };

public:
    using Inner = Inner;  // Alias with same name as type
};

int main(int argc, const char * argv[]) {
    static_assert(std::is_pod<Test::Inner>::value, "");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

用 clang 编译得很好,但不能用 GCC/Visual C++ 编译(“内部是私有的...”错误消息)

Bat*_*eba 5

GCC 和 Visual C++ 是正确的。

事实上,您可以使用using来有效地更改成员的访问权限,例如

using Inner_ = Inner;
Run Code Online (Sandbox Code Playgroud)

static_assert(std::is_pod<Test::Inner_>::value, "");
Run Code Online (Sandbox Code Playgroud)

在函数中。

但在类型别名与成员同名的情况下,C++ 要求作用域解析运算符查找该成员。因此,在您的情况下Test::Inner,指的是实际成员而不是 ,using因此编译应该失败,因为它是private


请参阅https://en.cppreference.com/w/cpp/language/qualified_lookup,特别是

命名空间 N 范围内的限定查找首先考虑位于 N 中的所有声明以及位于 N 的内联命名空间成员(以及传递性地位于其内联命名空间成员中)的所有声明。如果该集合中没有声明,则它会考虑由 N 中找到的 using 指令命名的所有命名空间以及 N 的所有传递内联命名空间成员中的声明