[basic.link] / 8包含以下声明:
不带链接的类型不得用作变量或类型 具有外部连接的功能,除非
(8.7) - 实体有C. 语言联系(7.5)或
(8.8) - 实体在一个范围内宣布 未命名的命名空间(7.3.1)或
(8.9) - 该实体没有使用 (3.2)或在同一翻译单元中定义。
显然,满足(8.8)的条件是不可能的,因为在未命名的命名空间中声明的实体不能同时具有外部链接。
然后我决定找一个函数的例子,外部链接返回一个没有链接的类型,即返回一个本地类的对象,但无论函数是否是,或者不是,都是无效的,在与该类型相同的TU中。我担心满足(8.9)的选项集也可能是空的。如果是这种情况,我希望听到一些确认。
关于(8.7)我不知道该说些什么,但在我看来,这个要点也不会给问题增添新的东西。
答案 0 :(得分:1)
所以看起来8.8
是defect report 2058: More errors from internal-linkage namespaces所涵盖的缺陷:
问题1603处理了应用更改中的遗漏,以便为未命名的命名空间提供内部链接,但其解决方案忽略了几个项目。
[...]
另外,3.5 [basic.link]第8段说,
不带链接的类型不能用作变量的类型 除非
,否则具有外部联系功能...
实体在未命名的命名空间中声明(7.3.1 [namespace.def])或
...
此子弹不会发生,因为在未命名的命名空间中声明的函数或变量不能具有外部链接。
defect report 757添加了8.9
,其中包含理由。
答案 1 :(得分:0)
一种情况是你有模板。
template<typename T>
void f(T t) { t(); }
int main() { f([]{}); }
实例化的函数具有外部链接,而T
是没有链接的类型。严格来说,实例化并未实例化为TU
(实例化实例化实例化)。但我怀疑文本是否也适用于此。
就像这样(我假设你已经知道了,但这当然是一个变量)
struct { } x;
有了这个,你可以构建满足规则的正常函数
decltype(x) f() { return {}; }