【问题标题】:Move constructor versus copy constructor behavior on class with no member variables在没有成员变量的类上移动构造函数与复制构造函数行为
【发布时间】:2019-08-17 11:56:48
【问题描述】:
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);

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

【问题讨论】:

  • Good ol' 最令人头疼的解析。
  • 确实最烦人...

标签: c++ templates move-semantics


【解决方案1】:

Foo&lt;NullTimer&gt; bar(NullTimer());是一个函数声明;它声明了一个名为bar 的函数,它返回Foo&lt;NullTimer&gt;,并有一个未命名的参数,它是一个返回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

【讨论】:

  • Foo&lt;NullTimer&gt; bar((NullTimer())) 也可以,但出于可读性原因,我认为带大括号的表单应该是首选。
  • @Brian 是的,这是 C++11 之前的一般解决方法。
猜你喜欢
  • 2013-03-27
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 2017-06-11
  • 2023-03-20
  • 2018-03-12
  • 1970-01-01
  • 2014-04-15
相关资源
最近更新 更多