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

问题描述 投票:2回答:1
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);

有人能解释构造函数机制的根本区别,以及它为什么会导致不同的行为?

c++ templates move-semantics
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.