Страницы

Поиск по вопросам

пятница, 17 мая 2019 г.

Разное поведение constexpr на разных платформах

Доброго времени суток. Есть класс, который включает в себя другой класс со статическими членами массивами. Я очень хочу сделать что бы у меня была возможность задать все статик значения этих членов в хедере а не в cpp части. Для этого я применил constexpr и эта схема нормально заработала на компиляторе от Microsoft. Однако на g++ под ARM на Debian этот код не компилируется:
undefined reference to `Foo::Target::IP'
В обоих случаях используется С++14. Вопрос вот в чём. Почему один компилятор это принимает, а другой нет, т.е. в чём отличия работы с constexpr внутри у этих компиляторов? Это никак не стандартизовано? Что мне сделать, чтобы такая схема заработала?
class Foo { public: static void GetIp(uint8_t* data) { memcpy(data, &Target::IP[0], 4); }; private: class Target { public: static constexpr uint8_t IP[4] = { 192,168,0,110 }; static constexpr uint16_t Port = 3000; }; }; int main() { uint8_t A[4]; Foo::GetIp(A); printf("%u.%u.%u.%u", A[0], A[1], A[2], A[3]); system("PAUSE"); return 0; }


Ответ

Да чтоб заработало, все просто - добавить
constexpr uint8_t Foo::Target::IP[4];
Только и всего. См. https://ideone.com/ZMqPMn
Но вот что именно строго по стандарту, а что нет - тут я не скажу, не уверен. Понятно, что целочисленное поле и массив - разные вещи, но что именно стандарт разрешает, что нет, и что отдает на откуп реализации - не скажу...

Комментариев нет:

Отправить комментарий