Clang/LLVM 6.0.0 в Windows не нуждается в определении для объявления статических данных

Clang/LLVM 6.0.0 не запрашивает определения объявления статического данных. См. Следующую небольшую программу:

//main.cpp

#include <iostream>

struct A
{
  void f()
  {
    std::cout << "bla";
  }
};

struct S
{
  static A a; // declaration, not definition
};

int main()
{
  S::a.f();
}

Этот код успешно компилируется (с -Xclang -std = С++ 17 -Xclang -flto -Xclang -O3) и выводит "bla". Но нет определения S нет :: а.

В отличие от MSVC не компилируется и не жалуется на неразрешенный внешний символ S :: a.

Теперь это ошибка в Clang/LLVM, не так ли?

+2
источник поделиться
3 ответа

basic.def.odr

Каждая программа должна содержать ровно одно определение каждой не-встроенной функции или переменной, которая не используется в этой программе вне отбрасываемого оператора; не требуется диагностика.

+2
источник

Возможно, компилятор оптимизирует ваш код:

int main()
{
  std::cout << "bla";
}

Поэтому линкер никогда не видит неопределенного символа и не жалуется.

+1
источник
другие ответы

Связанные вопросы


Похожие вопросы

код является неопределенным поведением, потому что вы обращаетесь к объекту до его инициализации, он похож на этот ответ

так как это неопределенное поведение для вызова membre fonction без инициализации, компилятор может предположить, что вы инициализировали объект где-то и создали результат, который вы видите

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос