c++ - `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
这是一个
clang++
错误吗?或者标准中是否有一些规则使该代码格式错误?如果
clang++
正确,将friend
成员函数标记为的正确方法是[[nodiscard]]
什么?
解决方案
每个属性说明符序列都被称为属于某个实体或语句,由它出现的句法上下文标识([stmt.stmt]、[dcl.dcl]、[dcl.decl])。如果属于某个实体或语句的属性说明符序列包含不允许应用于该实体或语句的属性或对齐说明符,则程序格式错误。如果属性说明符序列属于友元声明,则该声明应为定义。任何属性说明符序列都不应属于显式实例化。
强调我的
所以,clang就在这里。如果你有一个属性,那么如果它是友元函数,则该函数必须有一个定义。
推荐阅读
- amazon-web-services - 想要使用 JAVA 8 将 VPC 中的 AWS lambda 调用到同一区域和帐户中没有 VPC 的另一个 AWS lambda
- python-3.x - 我想在 Python 脚本中使用以下命令和 subprocess.run()
- macos - 如何从 CLI 中的 saml 响应的 509 证书属性中获取证书的指纹
- server - Proxmox apt-get 更新失败
- pandas - 熊猫 to_csv 应该抑制指数
- php - 如何在 laravel JOB 表中存储附加数据
- regex - 如果之前存在正则表达式匹配
- go - Doom Emacs 中对 golang 的完整 IDE 功能支持
- google-kubernetes-engine - GKE - 想知道在 configmap 中存储信息 - 是否保证不会从 GKE 中删除秘密?
- python - 获取直方图的pdf