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++ 编译(“内部是私有的...”错误消息)
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 的所有传递内联命名空间成员中的声明
| 归档时间: |
|
| 查看次数: |
334 次 |
| 最近记录: |