我想返回一个C++数组的引用。我指的是下面例子中的getColor2
成员函数及其重写。
我在基类ILed
中有一个纯虚成员函数:
[[nodiscard]] virtual const uint8_t (&getColor2() const)[4] = 0
字符串
我在子类HardwareLed
中有这个方法:
[[nodiscard]] const uint8_t (&getColor2() const)[4] override;
型
我希望后一个函数覆盖前一个函数,但是当使用gcc(例如13.2)时,我得到了这些错误消息:
<source>:62:53: error: expected ';' at end of member declaration
62 | [[nodiscard]] const uint8_t (&getColor2() const)[4] override;
| ^
| ;
<source>:62:55: error: 'override' does not name a type
62 | [[nodiscard]] const uint8_t (&getColor2() const)[4] override;
|
型
使用相同的源代码,但使用clang 17.0.1或icx 2023.2.1不会产生这些错误,应用程序编译成功。
下面是完整的示例:https://godbolt.org/z/d7j7ozKbM
我可以只使用指向数组的原始指针(也许使用一个结构体和一个reinterpret_cast
指令),但对我来说这似乎不是一个好的解决方案。
我也想在GCC中提交一个bug,但我不确定他们是否会允许我(GCC bugzilla说,我很快就会收到邀请?),他们有很多已知的问题,我不能确切地确定这是否是其中之一(例如,不完整的类型),因为我是一个C++新手。
任何帮助都非常感谢!
2条答案
按热度按时间xkrw2x1b1#
首先,返回一个数组成员的引用本质上并没有错。它与试图从一个自由函数返回一个数组有很大的不同。另外,GCC只是使用了不同的语法,在我看来这是一个bug,但我需要一些语言律师来确认这一点。要使你的代码在gcc上编译,请使用以下代码。
字符串
演示:https://godbolt.org/z/xMqPzT1vc
ioekq8ef2#
我会使用
std::array<uint8_t, 4>
,参见https://godbolt.org/z/h3TjxYv3b。有一个优点-可读性:
字符串
using arr = uint8_t[4]
也可以使用:https://godbolt.org/z/Pbxhb8h3G。型