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

时间:2015-10-29 16:58:36

标签: c++ language-lawyer c++14 linkage

N4140中的

[basic.link] / 8包含以下声明:

  

不带链接的类型不得用作变量或类型   具有外部连接的功能,除非
  (8.7) - 实体有C.   语言联系(7.5)或
  (8.8) - 实体在一个范围内宣布   未命名的命名空间(7.3.1)或
  (8.9) - 该实体没有使用   (3.2)或在同一翻译单元中定义。

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

然后我决定找一个函数的例子,外部链接返回一个没有链接的类型,即返回一个本地类的对象,但无论函数是否是,或者不是,都是无效的,在与该类型相同的TU中。我担心满足(8.9)的选项集也可能是空的。如果是这种情况,我希望听到一些确认。

关于(8.7)我不知道该说些什么,但在我看来,这个要点也不会给问题增添新的东西。

2 个答案:

答案 0 :(得分:1)

所以看起来8.8defect 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 {}; }