поведение clang -Wglobal-constructors в отношении конструктора копирования / перемещения - PullRequest
0 голосов
/ 20 апреля 2020

Этот код выдает предупреждение: «для объявления требуется глобальный конструктор [-Wglobal-constructors]» *

// Compile with -Wglobal-constructors
class T {
 public:
  constexpr T(int* p) : ptr_(p) {}
  T(const T& other) : T(other.ptr_) {}

 private:
  int* ptr_;
};

struct MyStruct {
  int x;
  T y;
};
MyStruct s[] {{ 123, nullptr },{ 234, nullptr }};

Я думал, что добавление constexpr T(std::nullptr_t) : ptr_(nullptr) {} позаботится об этом, но нет. Вместо этого делает конструктор копирования constexpr, что меня озадачивает. То же относится и к конструктору перемещения, если он был.

1 Ответ

0 голосов
/ 06 мая 2020

Оказывается, что это поведение продолжается до C ++ 14, но больше не имеет место в C ++ 17, где elision copy охватывает этот случай.

...