在没有成员变量的类上移动构造函数与复制构造函数的行为

时间:2019-03-27 01:08:58

标签: c++ templates move-semantics

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());

使用模板化类型的move构造函数在我的嵌入式应用程序中导致奇怪的行为(由于嵌入式特性而难以诊断)。如果我分两步(使用副本构造函数)进行操作,则它的行为将达到预期的效果。

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

有人可以解释构造函数机制上的根本差异,以及为什么会引起不同的行为吗?

1 个答案:

答案 0 :(得分:3)

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()));

请参见Most vexing parse