首页 > 解决方案 > `friend` 成员函数和属性 - gcc vs clang

问题描述

以下代码片段:

struct a
{
    [[nodiscard]] friend int b();
};

编译时产生此clang++ (trunk 342102)错误-std=c++17

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

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

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

Godbolt 上的实时示例:https ://gcc.godbolt.org/z/ttTDuZ


标签: c++attributeslanguage-lawyerc++17friend-function

解决方案


根据[dcl.attr.grammar]/5

每个属性说明符序列都被称为属于某个实体或语句,由它出现的句法上下文标识([stmt.stmt]、[dcl.dcl]、[dcl.decl])。如果属于某个实体或语句的属性说明序列包含不允许应用于该实体或语句的属性对齐说明符,则程序格式错误。如果属性说明符序列属于友元声明,则该声明应为定义。任何属性说明符序列都不应属于显式实例化。

强调我的

所以,clang就在这里。如果你有一个属性,那么如果它是友元函数,则该函数必须有一个定义。


推荐阅读