这段代码
int clash;
struct Foo {
decltype(clash) clash;
};
在 clang 上静默编译,但在 gcc 上编译失败并给出错误
错误:声明“int Foo::clash”[-fpermissive]
错误:将“冲突”的含义从“int冲突”更改为[-fpermissive]
出现错误似乎需要两个因素:
遮蔽必须由类成员完成(如果它是函数的局部作用域,则没有问题)。
decltype([shadowed name]) 必须在声明 [shadowing name] 之前在遮蔽范围中使用。
我的问题有两个:
- gcc 拒绝这段代码是否合理?
- 标准里哪里这么说的?
gcc
是正确的,程序格式错误,尽管这种特定的违规行为不需要诊断,所以clang
不必提供之一。
如果我们看一下 C++11 标准(最接近的草稿是N3337 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf) 部分3.3.7
类别范围它说:
S 类中使用的名称 N 应指代其中的相同声明
上下文以及在 S 的完整范围内重新评估时。否
如果违反此规则,则需要进行诊断。
下一条规则说:
如果对类中的成员声明重新排序会产生替代的有效
(1) 和 (2) 下的程序,该程序格式错误,没有诊断
必需的。
我们希望防止重新排序类中的声明会产生不同的程序,这是有道理的。令人好奇的是这两条规则是否多余 https://stackoverflow.com/q/26761385/1708801.
本节还提供了以下示例:
enum { i = 1 };
class X {
char v[i]; // error: i refers to ::i
// but when reevaluated is X::i
int f() { return sizeof(c); } // OK: X::c
char c;
enum { i = 2 };
};
如果我们尝试这个例子gcc
(现场观看 http://coliru.stacked-crooked.com/a/97971da06b99038c),我们得到与您的代码产生的错误几乎相同的错误:
error: declaration of 'i' [-fpermissive]
enum { i = 2 };
^
error: changes meaning of 'i' from '<anonymous enum> i' [-fpermissive]
enum { i = 1 };
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)