c++ - 在没有成员变量的类上 move 构造函数与复制构造函数行为

标签 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);

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

最佳答案

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

关于c++ - 在没有成员变量的类上 move 构造函数与复制构造函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55368353/

相关文章:

c++ - 我是否已成功从堆中删除指针?

c++ - Z3 c++ api 替换数组

c++ - 将整数转换为可观的 vector 或字符串

C++ 模板特化优先级。模板化特化

c++ - 用于位计数的元程序

c++ - 如何 move initializer_list 的元素?

c++ - move 构造函数和 `std::array`

c++ - 除法不跨越字节

c++ - 无用调用 std::move 与 std::vector::at

c++ - 生成模板包