为什么 C++20 中的 [[likely]] 属性会在此处引发警告?

One*_*Day 3 c++ gcc c++20

#include <iostream>

int foo(int a, int b)
{
    if(a < b) [[likely]] {
        return a;
    }
    return b;
}

int main()
{
    std::cout << foo(3,1) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

演示

根据参考资料,这似乎是我们应该如何if[[likely]]or[[unlikely]]属性装饰子句。C++20 也支持它(请参阅此处)。

但是,我遇到了警告:

main.cpp:在函数“int foo(int, int)”中:
main.cpp:5:15: 警告:语句开头的属性被忽略 [-Wattributes]
    5 | if(a < b) [[可能]] {
      | ^~~~~~~~~~

代码库对警告很严格,这会导致构建失败。那么,我做错了什么,还是这是一个错误?

我的 macbook 上的 g++ 版本:

g++-9(自制 GCC 9.3.0_1)9.3.0
版权所有 (C) 2019 Free Software Foundation, Inc.
这是免费软件;请参阅复制条件的来源。没有
保修单; 甚至不是为了特定目的的适销性或适合性。

T.C*_*.C. 5

你的代码没有任何问题。这是因为 GCC 的实现者忽略了复合语句上的属性是一个事实

[[likely]] if (whatever) {}完全意味着别的东西——这意味着if语句本身是“可能的”,而不是它的一个分支。