重写返回数组引用的方法在GCC中不起作用,但在clang/icx中起作用

czfnxgou  于 2024-01-08  发布在  其他
关注(0)|答案(2)|浏览(142)

我想返回一个C++数组的引用。我指的是下面例子中的getColor2成员函数及其重写。
我在基类ILed中有一个纯虚成员函数:

  1. [[nodiscard]] virtual const uint8_t (&getColor2() const)[4] = 0

字符串
我在子类HardwareLed中有这个方法:

  1. [[nodiscard]] const uint8_t (&getColor2() const)[4] override;


我希望后一个函数覆盖前一个函数,但是当使用gcc(例如13.2)时,我得到了这些错误消息:

  1. <source>:62:53: error: expected ';' at end of member declaration
  2. 62 | [[nodiscard]] const uint8_t (&getColor2() const)[4] override;
  3. | ^
  4. | ;
  5. <source>:62:55: error: 'override' does not name a type
  6. 62 | [[nodiscard]] const uint8_t (&getColor2() const)[4] override;
  7. |


使用相同的源代码,但使用clang 17.0.1icx 2023.2.1不会产生这些错误,应用程序编译成功。
下面是完整的示例:https://godbolt.org/z/d7j7ozKbM
我可以只使用指向数组的原始指针(也许使用一个结构体和一个reinterpret_cast指令),但对我来说这似乎不是一个好的解决方案。
我也想在GCC中提交一个bug,但我不确定他们是否会允许我(GCC bugzilla说,我很快就会收到邀请?),他们有很多已知的问题,我不能确切地确定这是否是其中之一(例如,不完整的类型),因为我是一个C++新手。
任何帮助都非常感谢!

xkrw2x1b

xkrw2x1b1#

首先,返回一个数组成员的引用本质上并没有错。它与试图从一个自由函数返回一个数组有很大的不同。另外,GCC只是使用了不同的语法,在我看来这是一个bug,但我需要一些语言律师来确认这一点。要使你的代码在gcc上编译,请使用以下代码。

  1. [[nodiscard]] const uint8_t (&getColor2() const override)[4];

字符串
演示:https://godbolt.org/z/xMqPzT1vc

ioekq8ef

ioekq8ef2#

我会使用std::array<uint8_t, 4>,参见https://godbolt.org/z/h3TjxYv3b
有一个优点-可读性:

  1. const std::array<uint8_t, 4>& getColor2() const; // is easier to read than
  2. const uint8_t (&getColor2() const)[4];

字符串
using arr = uint8_t[4]也可以使用:https://godbolt.org/z/Pbxhb8h3G

  1. arr& getColor2() const;

相关问题