【问题标题】:Declarations of a class name and a variable with the same name类名和同名变量的声明
【发布时间】:2015-03-09 20:20:22
【问题描述】:

标准N4296::3.3.1/4 [basic.scope.declarative]

正好一个声明应该声明一个类名或枚举名 那不是 typedef 名称,其他声明都应引用 指向同一个变量或枚举数,或者都指向函数和 功能模板;在这种情况下,类名或枚举名是 隐藏 (3.3.10)。

我知道,如果在同一个声明区域中存在同名的变量/函数声明,则该规则是在讨论隐藏类的名称。但是 exactly one 有点令人困惑。以下命名空间完全有效:

namespace A
{
    struct A;
    struct A { };
    int A;
}

DEMO

虽然我们两次声明了struct A(一个结构的两个声明和一个变量的一个声明)。怎么了?我在规则中失去了什么?

【问题讨论】:

  • 我认为这是为了禁止struct A { int x; }; enum A { y };之类的东西,但措辞有点过于严格了。
  • 您实际上并没有两次声明该结构:“仅由 class-key identifier; 组成的声明要么是在当前范围内重新声明名称,要么是转发将标识符声明为类名。”
  • “仅由 class-key identifier 组成的声明;要么是对当前范围内名称的重新声明,要么是将标识符作为类名的前向声明”是在[class.name]/2.

标签: c++ declaration


【解决方案1】:
// Exactly one class may have the name:
struct A; // Declaration of a new class.
struct A { }; // Definition, but not a declaration of a new name. Doesn't count.

// Aside from the class, exactly one variable may share the name:
extern int A; // Declaration of a variable.
int A; // Definition of a variable.

【讨论】:

  • 为什么struct A { }; 不算数?
  • @T.C.它不是在宣布新的东西。它在语法上是一个声明,但它不是“声明一个名字”。也许 introduce 会是一个更好的词,以匹配 [basic] §3/5。
  • 是的,我想我们都同意它不应该算,但我认为你不能得出它的结论> 按照书面标准计算。
  • @T.C.我同意可能存在缺陷,据我所知,我认为替换“介绍”可以弥补它。 (类名也可以由详细的类型说明符引入,所以它可能应该是“最多一个......应该被引入”,而没有提及声明本身。)但是,在我真正开始之前还有更多的文本需要查看提交 DR,我没有这样做的计划。
【解决方案2】:

struct A; 是一个声明。然而,struct A { }; 是一个定义

【讨论】:

  • 定义就是声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
相关资源
最近更新 更多