Перемещение конструктора к поведению конструктора копирования в классе без переменных-членов - PullRequest
2 голосов
/ 27 марта 2019
class NullTimer {
 public:
  inline static bool changePeriod (const size_t) { return false; }
  inline static void dispose (void) {}
  inline static bool isActive (void) { return false; }
  inline static void reset (void) {}
  inline static void start (void) {}
  inline static void stop (void) {}
};

template <
  Timer
>
class Foo {
 public:
  Foo (
    const Timer & t
  ) :
    _t(t)
  {}

  Foo (
    Timer && t
  ) :
    _t(t)
  {}
 private:
  Timer t;
};

Foo<NullTimer> bar(NullTimer());

Использование конструктора перемещения шаблонного типа вызывает странное поведение во встроенном приложении ( трудно диагностировать из-за встроенной природы ). Если я сделаю это в два этапа (используя конструктор копирования), то он будет вести себя как положено.

NullTimer nt;
Foo<NullTimer> bar(nt);

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

1 Ответ

3 голосов
/ 27 марта 2019

Foo<NullTimer> bar(NullTimer()); - объявление функции;он объявляет функцию с именем bar, которая возвращает Foo<NullTimer>, и имеет неназванный параметр, который является указателем на функцию, возвращающую NullTimer и ничего не получающую.

Вы можете изменить ее на

// since C++11
Foo<NullTimer> bar(NullTimer{});
Foo<NullTimer> bar{NullTimer()};
Foo<NullTimer> bar{NullTimer{}};

// before C++11
Foo<NullTimer> bar((NullTimer()));

См. Самый неприятный анализ

...