名称查找规则统一适用于所有名称(包括typedef-names(10.1.3),namespace-names (10.3)和类名(12.1))语法允许在a讨论的上下文中使用这些名称 特别规则。名称查找将名称的使用与该名称的一组声明(6.1)相关联。该 通过名称查找找到的声明应全部声明同一实体或全部声明功能;在里面 在后一种情况下,声明声称形成一组重载函数(16.1)。过载分辨率(16.3) 在名称查找成功后进行。访问规则(第14条)仅被视为一次名称 查找和函数重载决策(如果适用)已成功。只有在名称查找后才能运行 重载决议(如果适用)和访问检查成功是由...引入的属性 name的声明在表达式处理中进一步使用(第8条)。
名称声明引入的属性是什么?
答案 0 :(得分:0)
此句子在2004年4月的N1638 - C++ Working Draft中可见,因此它并未特别提及[[...]]
形式的属性,这些属性已由N2761 - Towards support for attributes in C++
(Revision 6)引入标准在2008年。
[basic.lookup] / 1
仅在名称查找,函数重载解析(如果适用)和访问检查成功后是由表达式处理中进一步使用的名称声明引入的属性(第5节)。
另外[basic.def] / 1
声明(第7条)将名称引入翻译单元或由先前声明引入的重新声明名称。声明指定了这些名称的解释和属性。
从上面看,并查看其他五个'属性'在那篇论文中,在我看来,'属性'只是意味着"有关名称的信息"。所以在这种情况下,像extern
,friend
,函数定义的主体,以及关于声明中的名称的任何其他内容,这不是确定解释的一部分一个名字。
从C ++ 11开始,这也包括"广义属性"以[[..]]
的形式。这里有一个提示,N2761没有介绍'属性',它只是为我们提供了一个通用语法。
相反,功能参数不属于'属性'从这个意义上讲,由于函数名称的解释涉及参数作为重载决策的一部分。 返回类型将是一个属性,因为在我们知道名称的含义以及我们选择的超载之前,我们不会查看它。
在一个稍微更为标准的意义上,我认为你可以说'说明符'是属性,而“声明者”是#。指定名称的解释。
实际上,我会说(不检查更具体的规则)这是要求已删除的函数在查找和名称解析过程中一直存活的规则,然后失败汇编。
否则,一个狡猾的编译器作者可能希望通过先前删除已删除的函数来保存用户一些悲伤,理由是你无法调用已删除的函数,所以为什么还要包括它在过载集中?