gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:26:28 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com