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);
有人可以解释构造函数机制上的根本差异,以及为什么会引起不同的行为吗?
答案 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()));