Ниже приведен упрощенный код, скомпилированный с g++ -c test.cpp
или g++ -std=c++17 -c test.cpp
#include <cstddef>
struct sd_bus_vtable {
union {
struct {
size_t element_size;
} start;
struct {
const char *member;
const char *signature;
} signal;
} x;
};
sd_bus_vtable get()
{
return {
.x = {
.signal = {
.member = "",
.signature= "",
}
}
};
}
Он прекрасно компилируется на G CC 9.2.0 и clang 5/6, но не работает на 8.3.0 или 7.4 .0 с сообщением об ошибке ниже:
test.cpp:25:5: error: could not convert ‘{{{"", ""}}}’ from ‘<brace-enclosed initializer list>’ to ‘sd_bus_vtable’
};
Чтобы обойти это, можно изменить функцию get()
, как показано ниже, но выглядит не так чисто ...
sd_bus_vtable get()
{
struct sd_bus_vtable t = {
.x = {
.signal = {
.member = "",
.signature= "",
}
}
};
return t;
}
Вопрос в том, действителен ли приведенный выше код или нет? Если да, вызывает ли это какую-то ошибку в G CC, которая исправлена в GCC9?