在没有成员变量的 class 上移动构造函数与复制构造函数行为
Move constructor versus copy constructor behavior on class with no member variables
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);
有人可以解释构造函数机制的根本区别,以及为什么会导致不同的行为吗?
Foo<NullTimer> bar(NullTimer());
是一个函数声明;它声明了一个名为 bar
的函数,其中 returns 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()));
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);
有人可以解释构造函数机制的根本区别,以及为什么会导致不同的行为吗?
Foo<NullTimer> bar(NullTimer());
是一个函数声明;它声明了一个名为 bar
的函数,其中 returns 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()));