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