N4140 中 [basic.link]/8 中要点的目的是什么?他们似乎没有带来任何新的东西

What is the purpose of the bullet points in [basic.link]/8 in N4140? They don't seem to bring anything new the statement preceding them

N4140 中的

[basic.link]/8 包含以下语句:

A type without linkage shall not be used as the type of a variable or function with external linkage unless
(8.7) — the entity has C language linkage (7.5), or
(8.8) — the entity is declared within an unnamed namespace (7.3.1), or
(8.9) — the entity is not odr-used (3.2) or is defined in the same translation unit.

显然满足 (8.8) 的条件是不可能的,因为在未命名的命名空间中声明的实体不能同时具有外部链接。

然后我决定找一个带有外部链接的函数返回一个没有链接的类型的例子,即返回一个本地class的对象,但无济于事,不管这个函数是,还是不是,与类型在同一个 TU 中。恐怕满足(8.9)的选项集也可能是空的。如果是这样的话,我想听听对此的一些确认。

参考(8.7)我不知道该说什么,但在我看来,这个要点也不会给问题增加任何新内容。

所以看起来 8.8 是一个被 defect report 2058: More errors from internal-linkage namespaces 覆盖的缺陷:

Issue 1603 dealt with omissions in the application of the change to give unnamed namespaces internal linkage, but its resolution overlooked a couple of items.

[...]

Also, 3.5 [basic.link] paragraph 8 says,

A type without linkage shall not be used as the type of a variable or function with external linkage unless

...

the entity is declared within an unnamed namespace (7.3.1 [namespace.def]), or

...

这个项目符号不会出现,因为在未命名的命名空间中声明的函数或变量不能有外部链接。

并且 8.9 是由 defect report 757 添加的,其中包括一个基本原理。

一种情况是您有模板。

template<typename T>
void f(T t) { t(); }

int main() { f([]{}); }

实例化的函数有外部链接,而T是没有链接的类型。不过,严格来说,实例化并未实例化为 TU(实际上,实例化存在于实例化单元中)。但我怀疑文本也适用于此。

和这个一样(我假设你已经知道了,但这当然是一个变量)

struct { } x;

有了它,您也可以构造满足规则的普通函数

decltype(x) f() { return {}; }