澄清没有暂定定义的理由

Pav*_*kin 2 c++ initialization language-lawyer

C++17 (N4713),C.1.2 第 6 条:基本概念,1:

\n
\n

更改:C++ 没有像 C 中那样的 \xe2\x80\x9ctentative 定义\xe2\x80\x9d。

\n

理由:这避免了基本类型和用户定义类型具有不同的初始化规则。

\n
\n

问题:基本类型和用户定义类型的初始化规则有何不同?有什么例子吗?

\n
\n

额外:以下是 C 中相互引用的文件本地静态对象:

\n
struct X { int i; struct X* next; };\nstatic struct X a;\nstatic struct X b = { 0, &a };\nstatic struct X a = { 1, &b };\n
Run Code Online (Sandbox Code Playgroud)\n

在 C++ 中,此代码无效。如何在C++中实现同样的效果?

\n

use*_*751 7

声明具有文件作用域的事物的首选方法是匿名命名空间。里面的所有内容namespace {}都有文件范围。您可以声明函数、类、变量等,extern就像平常声明一样a

请注意,在 C++ 中不需要编写struct X

struct X { int i; X* next; };
namespace {
    extern X a;
    X b = { 0, &a };
    X a = { 1, &b };
}
Run Code Online (Sandbox Code Playgroud)