如何为类的友元函数正确声明[[noreturn]]属性?
如何为类的友元函数正确声明[[noreturn]]属性
你尝试给类的友元函数添加[[noreturn]]属性时遇到了编译错误,核心问题是友元声明本身不能作为函数属性的承载位置,C++语法不允许在非定义的友元声明前直接放置属性。
原代码的问题
你的代码中,友元声明[[noreturn]] friend int b();不符合语法规范:
- GCC会忽略友元声明上的属性,导致后续定义的
[[noreturn]]与首次无属性的声明冲突,抛出错误。 - Clang直接报错属性不能出现在该位置,同时也会因为属性未在首次声明出现而报错。
正确写法
方案1:先在类外声明带属性的函数,再声明友元
将函数的首次声明放在类外部并携带[[noreturn]],类内仅做友元声明:
[[noreturn]] int b(); struct a { friend int b(); }; [[noreturn]] int b(){ throw 42; }
这样函数b的首次声明就包含了[[noreturn]]属性,友元声明仅用于授予访问权限,不会破坏属性的一致性。
方案2:在类内直接定义友元函数(带属性)
如果友元函数的定义直接写在类内,可以将属性放在函数定义前:
struct a { friend [[noreturn]] int b() { throw 42; } };
此时友元声明同时是函数的定义,属性可以直接附着在函数上,编译器会正确识别。
内容的提问来源于stack exchange,提问作者ComicSansMS
相关产品推荐
相关产品推荐

