ошибка: переменная constexpr 'struct2Var' должна быть инициализирована константным выражением - PullRequest
1 голос
/ 07 января 2020

Следующая программа завершается с ошибкой при компиляции с Clang с ошибкой : переменная constexpr 'struct2Var' должна быть инициализирована константным выражением {var, 2100433} .

Если я удаляю __attribute__((weak)) из объявления "var", оно проходит без проблем.

Может кто-нибудь объяснить теорию / причину этой ошибки.

struct myStruct
{
public:
 constexpr operator const wchar_t*() const
 {
  return &m_cch;
 }

 const wchar_t m_cch;
};

extern  __attribute__((weak)) const constexpr myStruct var {'a'};

struct myStruct2
{
 const wchar_t* stzKey = nullptr;

 int intvar = 0;
};

static constexpr const myStruct2 struct2Var[1]
{
  {var, 2100433}
};

1 Ответ

3 голосов
/ 07 января 2020

Похоже, использование __attribute__((weak)) сбрасывает квалификатор constexpr с лязгом, но не с g cc. Несмотря на то, что clang пытается заменить замену g cc, он может реализовать такую ​​нестандартную функцию по-другому. В этом случае я бы сказал, что ни g cc, ни clang не верны.

Кроме того, глобальный constexpr может быть сложно поддерживать, поскольку все они должны определяться последовательно в каждой единице перевода. Чтобы решить эту проблему, встроенная переменная была добавлена ​​в C ++ 17.

...