命名空间成员定义

发布于 2024-10-04 08:41:28 字数 431 浏览 6 评论 0原文

namespace M{
   void f();
   void M::f(){}
}

int main(){}

上面的代码给出了这样的错误:

“ComeauTest.c”,第 3 行:错误: 不允许使用限定名称 命名空间成员 宣言 void M::f(){}

并且

G++ 也给出错误。

VS2010 编译良好。

我的问题是:

a) 预期的行为是什么?

b) $7.3.1.2 似乎没有谈到这个限制。标准的哪一部分指导此类代码的行为?

namespace M{
   void f();
   void M::f(){}
}

int main(){}

The above code gives error like so:

"ComeauTest.c", line 3: error:
qualified name is not allowed in
namespace member
declaration
void M::f(){}

And

G++ also gives error.

But

VS2010 compiles fine.

My questions are:

a) What is the expected behavior?

b) $7.3.1.2 does not seem to talk about this restriction. Which portion of the Standard guides the behavior of such code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

妥活 2024-10-11 08:41:28

标准的哪一部分指导此类代码的行为?

C++03 节 $8.3 说

除了类之外的成员函数 (9.3) 或静态数据成员 (9.4) 的定义、命名空间的函数或变量成员的定义或显式实例化之外,声明符 id 不得被限定其名称空间之外,或先前在其名称空间之外声明的显式特化的定义,或作为另一个类或名称空间成员的友元函数的声明 (11.4)。

所以你的代码格式不正确。

然而,在讨论问题 548 时,CWG 一致认为应取消对命名空间内限定声明符的禁止1

1:活跃问题482< /子>

Which portion of the Standard guides the behavior of such code?

C++03 Section $8.3 says

A declarator-id shall not be qualified except for the definition of a member function (9.3) or static data member (9.4) out-side of its class, the definition or explicit instantiation of a function or variable member of a namespace out-side of its namespace, or the definition of a previously declared explicit specialization outside of its name-space, or the declaration of a friend function that is a member of another class or namespace (11.4).

So your code is ill-formed.

However in discussing issue 548 the CWG agreed that the prohibition of qualified declarators inside their namespace should be lifted1.

1 : Active Issue 482

情话墙 2024-10-11 08:41:28

7.3.1.2-2 特别讨论了这一点:

命名命名空间的成员也可以通过所定义的名称的显式限定(3.4.3.2)在该命名空间之外定义,前提是该实体正在定义的内容已在命名空间中声明,并且该定义出现在包含该声明的命名空间的命名空间中的声明点之后。

M::f 被视为命名空间定义之外。

7.3.1.2-2 talks specifically about this:

Members of a named namespace can also be defined outside that namespace by explicit qualification (3.4.3.2) of the name being defined, provided that the entity being defined was already declared in the namespace and the definition appears after the point of declaration in a namespace that encloses the declaration’s namespace.

M::f is considered a outside of namespace definition.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文