为什么 C++ 中不允许类型别名作为友元类名?

xml*_*lmx 1 c++ types friend c++11 type-alias

class A {    
};

class B {
    using C = A;

    // Compilation error: 
    // Type alias 'C' cannot be referenced with a class specifier 
    friend class C;    
};
Run Code Online (Sandbox Code Playgroud)

为什么 C++ 中不允许类型别名作为友元类名?

背后的原理是什么?

use*_*570 6

为什么 C++ 中不允许类型别名作为友元类名?

您假设类型别名不允许出现在友元声明中是错误的。通过别名交友的正确语法Cfriend C;而不是friend class C;


另请注意,该程序格式不正确,并且 msvc未给出诊断是错误的。这可以从dcl.type.elab看出:

如果标识符或 simple-template-id 解析为类名或枚举名,则详细类型说明符将其引入声明中,就像简单类型说明符引入其类型名一样([dcl.type 。简单的])。 如果标识符或 simple-template-id解析为 typedef-name ([dcl.typedef], [temp.names]),则详细类型说明符格式错误。

(强调我的)

并且由于标识符C确实解析为typedef-name、 episted-type-specifier( class C),因此该程序是格式错误的