У меня есть очень простая структура C++ 20 с constexpr-ктором. Компилируется и работает нормально с последними версиями GCC, но не с MSVC 2022 с последними исправлениями. Компилятор MSVC неверен или я что-то пропустил?
struct GPSinfo_T {
char fixSources[6];
constexpr GPSinfo_T() :
fixSources("NNNNN")
{};
};
Вот MRE: демо (единственная проблема — массив символов).
Использование инициализаторов членов по умолчанию решает проблему MSVC: godbolt.org/z/r4Mxf6naT
Альтернативно вы можете использовать std::array
: godbolt.org/z/xP5x78YqE
Единственным элементом, вызывающим ошибку MSVC, является массив символов fixSources
, как вы можете видеть в этом минимально воспроизводимом примере:
struct GPSinfo_T {
char fixSources[6];
constexpr GPSinfo_T() :
fixSources("NNNNN")
{};
};
int main() {
}
Живая демо-версия 1 (с ошибкой в MSVC).
Я не лингвист и не уверен, какой компилятор здесь прав.
Но, как предположил @MarekR, возможным обходным решением для MSVC является использование инициализации элемента по умолчанию , как показано ниже (соответствует MRE выше):
struct GPSinfo_T {
char fixSources[6] = "NNNNN";
constexpr GPSinfo_T() = default;
};
int main() {
}
Живая демо-версия 2 (принимаются всеми составителями).
Альтернативно измените fixSources
на std::array<char, 6>
, и вы сможете использовать список инициализации членов, как в исходном коде.
Весь ли показанный код необходим для воспроизведения ошибок? Это правильный минимально воспроизводимый пример? Пробовали ли вы удалять инициализации переменных одну за другой, пока код не будет собран? Если да, то добавляйте по одной переменной за раз, чтобы выяснить, какая из них вызывает проблему.