gpt4 book ai didi

c++ - 奇怪的代码...有人可以解释一下吗

转载 作者:行者123 更新时间:2023-11-28 07:29:55 24 4
gpt4 key购买 nike

您好,我正在从 C 切换到 C++。在阅读 http://www.gotw.ca/publications/xc++.htm 时我看到了这个代码块。

const int i = 1;
const int j = 2;
struct x
{
int x;
};
namespace y
{
int i[i];
int j = j;
x x;
int y::y = x.x;
};

特别是在 namespace y 部分,我对此感到非常困惑。请向我解释这段代码的行为和命名空间的使用。此外,我在某处读到 namespace 的不当使用会导致违反 inheritance 的基本原则。请给我一些巧妙使用命名空间的例子。

最佳答案

这个例子使用了一些可怕的混淆代码来说明关于名称范围的一点。从 C++11 §3.3.6 [basic.scope.namespace] p1:

... A namespace member name has namespace scope. Its potential scope includes its namespace from the name’s point of declaration (3.3.2) onwards ...

声明点在§3.3.2 [basic.scope.pdecl] p1 中定义:

The point of declaration for a name is immediately after its complete declarator (Clause 8) and before its initializer (if any), except as noted below.

因此可以使用例如内部作用域中名为 i 的东西的初始值设定项中来自外部作用域的名称 i。有问题的代码:

const int i = 1;
const int j = 2;
struct x
{
int x;
};

namespace y
{
int i[i];
int j = j;
x x;
int y::y = x.x;
}

声明:

  • y::i 作为 1 个 int 的数组,将被隐式归零(因为所有静态存储持续时间对象如果没有显式初始化程序则被零初始化) ,
  • y::j 作为一个初始值为 2 的 int
  • y::x 作为 ::x 类型的结构,将被隐式置零,并且
  • y::y 是无效名称。如果它只是 y,它将是一个初始值为 0 的 int,因为它的初始化器 y::x.x 隐式零初始化。

Here's a demo (with y::y changed to y) at Coliru.

注意:永远不要写这样的代码。唯一一次使用名称的这种特性甚至可以接受的是类构造函数中的成员初始值设定项。如果你在其他地方这样做,我会找到你。我会让你付出代价。

关于c++ - 奇怪的代码...有人可以解释一下吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17938743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com