"朋友"成员函数和 GCC 与 Clang
`friend` member functions and gcc vs clang
以下代码片段:
struct a
{
[[nodiscard]] friend int b();
};
使用-std=c++17
在clang++ (trunk 342102)
上编译时产生此错误:
<source>:3:5: error: an attribute list cannot appear here
[[nodiscard]] friend int b();
^~~~~~~~~~~~~
删除friend
或向b
添加正文可防止错误。
g++ (trunk)
编译代码就好了。
神霹雳上的活生生的例子:https://gcc.godbolt.org/z/ttTDuZ
这是一个
clang++
错误吗?还是标准中的某些规则使此代码格式不正确?如果
clang++
是正确的,那么将friend
成员函数标记为[[nodiscard]]
的正确方法是什么?
per [dcl.attr.grammar]/5
据说每个属性说明符-seq都与某个实体或语句有关,由它出现的语法上下文标识([stmt.stmt], [dcl.dcl], [dcl.decl](。如果适用于某个实体或语句的属性说明符 seq包含不允许应用于该实体或语句的属性或对齐说明符,则程序格式不正确。如果属性说明符 seq适用于友元声明,则该声明应为定义。任何属性说明符 seq都不应依赖于显式实例化。
强调我的
所以,叮当就在这里。 如果你有一个属性,那么如果它是友元函数,则该函数必须有一个定义。
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99032
该错误已在 GCC 12 中修复,您现在有以下警告。
test.cpp:3:30: warning: attribute ignored [-Wattributes]
3 | [[nodiscard]] friend int b();
| ^
test.cpp:3:30: note: an attribute that appertains to a friend declaration that is not a definition is ignored
将友元成员函数标记为[[nodiscard]]
的正确方法是将属性放在其定义中。
struct a
{
friend int b();
};
[[nodiscard]] int b(){ return 42; }
相关文章:
- 奇怪的结构&GCC&clang(void*返回类型)
- 数据成员SFINAE的C++17测试:gcc vs clang
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- Clang bug?使用指针作为模板参数
- clang整洁10忽略了我的NOLINT命令
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在clang++预处理器中确定gcc工具链版本
- 为什么 Clang 不允许"and"作为函数名称?
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- clang格式:宏的缩进
- CLANG 编译器 说:变量"PTR"可能未初始化
- clang格式:禁用排序包含
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 循环展开 - G++ 与 Clang++
- 如何使用Clang/GCC在Mac上为C/C++设置VSCode
- 一位朋友将模板函数缩写为clang和gcc
- 类模板参数推导-clang和gcc不同