是成员声明`decltype(name)name;`在第一个名称引用封闭作用域的本地结构中允许
Is member declaration `decltype(name) name;` permitted in local struct where the first name refers to the enclosing scope?
示例:
int main()
{
int a = 0;
struct X
{
decltype(a) a;
};
return 0;
}
decltype(a)
是指main
中的本地a
,而它声明的成员共享相同的名称。
Clang编译时没有任何问题,MSVC14也是如此。
G++抱怨它,添加-fpermissive
使它通过
prog.cc:6:21: error: declaration of 'int main()::X::a' [-fpermissive]
decltype(a) a;
^
prog.cc:3:9: error: changes meaning of 'a' from 'int a' [-fpermissive]
int a = 0;
哪种行为符合标准?
我认为这违反了〔basic.scope.class〕/1(N3337(:
以下规则描述了类中声明的名称的作用域。
1( […]
2( 类
S
中使用的名称N
在其上下文中以及在S
的完整范围中重新评估时应引用相同的声明。违反此规则不需要进行诊断。
由于decltype(a)
是指在声明成员变量之前封闭作用域中的声明,但在"在X
的已完成作用域中重新求值"时指的是成员,因此程序格式不正确。不需要任何诊断,但GCC无论如何都提供了一个诊断(尽管它相当神秘(。三个编译器的行为都是有效的。
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- 在构造函数中输入对象时C++类成员作用域
- 无法让"std::enable_if"适用于无作用域枚举
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 如何在C++中访问作用域的变量输出?
- 重载时未在 C++ 的作用域错误中声明
- 是成员声明`decltype(name)name;`在第一个名称引用封闭作用域的本地结构中允许