`friend`成员函数和属性 - gcc vs clang

Vit*_*meo 4 c++ attributes friend-function language-lawyer c++17

以下代码段:

struct a
{
    [[nodiscard]] friend int b();
};
Run Code Online (Sandbox Code Playgroud)

产生在编译时这个错误clang++ (trunk 342102)-std=c++17:

<source>:3:5: error: an attribute list cannot appear here
    [[nodiscard]] friend int b();
    ^~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

删除friend或添加正文以b防止错误.

g++ (trunk) 编译代码就好了.

关于godbolt的实例:https://gcc.godbolt.org/z/ttTDuZ


  • 这是一个clang++错误吗?或者标准中是否有一些规则使得此代码格式错误?

  • 如果clang++是正确的,将friend成员函数标记为什么的正确方法是[[nodiscard]]什么?

Nat*_*ica 8

[dcl.attr.grammar]/5

每个属性说明符-seq被认为属于某个实体或语句,由它出现的句法上下文([stmt.stmt],[dcl.dcl],[dcl.decl])标识.如果属于某个实体或语句的attribute-specifier-seq包含不允许应用于该实体或语句的属性alignment-specifier,则该程序格式错误.如果属性说明符 -seq属于朋友声明,则该声明应为定义.没有attribute-specifier-seq应该与显式实例化有关.

强调我的

所以,铿锵就在这里.如果您有一个属性,则该函数必须具有定义(如果它是友元函数).