![](/img/trans.png)
[英]Why does Visual Studio compiler allow violation of private inheritance in this example?
[英]Why does the compiler allow this?
以下将成功编译:
struct XX {
int element;
};
int main ()
{
XX XX, prev_XX ;
prev_XX = XX;
XX = prev_XX; // ??? NO error: expected unqualified-id before '=' token
}
编译器如何知道它是类型还是变量?
编辑:
出现此错误:(来自sftrabbit的示例)
int main ()
{
XX XX, prev_XX;
XX XX2; // error: expected ';' before 'XX2'
}
变量名称隐藏了结构名称(第3.3.10节):
可以通过在嵌套的声明性区域或派生类(10.2)中使用相同名称的显式声明来隐藏名称。
如果需要具体引用结构名称,则需要使用详细的类型说明符struct XX
(第3.4.4节):
即使该名称已被非类型声明(3.3.10)隐藏,也可以使用精致的类型说明符(7.1.6.3)来引用先前声明的类名或枚举名。
因此,编译器知道XX
在这里引用了变量,因为这就是它可以对应的全部。 它甚至不会考虑它引用该结构的可能性。 实际上,让我们看看如果尝试将其用作类型会发生什么:
struct XX {
int elemnent;
};
int main ()
{
XX XX, prev_XX;
XX XX2; // Can we continue to use XX as a type?
}
我们实际上得到一个错误:
error: expected ‘;’ before ‘XX2’
因此,我们必须执行struct XX XX2;
,没有任何错误。
这是由于表达式的语法。
就像某些单词可以是名词或动词一样-取决于句子中的位置
对象的名称隐藏了结构的名称。 如果要指定结构,则应使用详细名称
XX XX;
struct XX YY;
它是在C ++中引入的,因为在C中结构名称和变量名称属于不同的名称空间,因为在C中必须始终使用结构指定关键字struct。 在C ++中,允许使用不带关键字struct的结构名,但是如果变量名重叠,则它们将隐藏结构名。
这是追溯到C时代的一个微妙问题。
当您声明XX XX;
第二个XX
(变量)遮盖了第一个XX
(类型)。 您仍然可以使用struct XX
命名该类型。
struct XX {};
int main() {
XX XX;
XX other; // error: expected ‘;’ before ‘other’
struct XX another; // OK
another = XX; // OK
return 0;
}
您可以在这里查看 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.