This question already has answers here:
Does a templated constructor override the implicit copy constructor in C++?
(3个答案)
7年前关闭。
我有一个带有复制构造函数和移动构造函数的类,这两个类都会向stdout报告消息,直到我弄清楚这个问题。当将局部对象推到 vector 上时,不会调用任何构造函数,从而导致以后的问题。但是,当我使用std::move告诉它使用move构造函数而不是copy构造函数时,一切正常。这是一个错误,还是我误解了std::vector的工作方式?
这些是我对象的构造函数:
这是发生问题的地方:
我期望得到输出...
...但是相反,我得到了...
当我更改返回状态的行时,我得到:
这使我深感困惑。
那不是复制构造函数。因此,它没有被调用。
编译器使用的是隐式生成的副本构造函数,而不是您编写的转换构造函数。
(3个答案)
7年前关闭。
我有一个带有复制构造函数和移动构造函数的类,这两个类都会向stdout报告消息,直到我弄清楚这个问题。当将局部对象推到 vector 上时,不会调用任何构造函数,从而导致以后的问题。但是,当我使用std::move告诉它使用move构造函数而不是copy构造函数时,一切正常。这是一个错误,还是我误解了std::vector的工作方式?
这些是我对象的构造函数:
template <typename R>
inline Ref (const Ref<R> &other)
: m_ptr(other.m_ptr)
{
LogDebugc("copy ctor ", long(other.m_ptr));
Retain(m_ptr);
}
template <typename R>
inline Ref (Ref<R> &&other)
: m_ptr(other.m_ptr)
{
LogDebugc("move ctor ", long(other.m_ptr));
other.m_ptr = nullptr;
}
这是发生问题的地方:
void SetState (State *state)
{
// Keep a reference so we don't free the state by mistake
Ref<State> ref (state);
s_stateStack.clear();
if (ref) {
LogDebugc("pre push ", long(state));
s_stateStack.push_back(ref);
LogDebugc("post push ", long(state));
}
}
我期望得到输出...
[dbg] pre push 6415744
[dbg] copy ctor 6415744
[dbg] post push 6415744
...但是相反,我得到了...
[dbg] pre push 6415744
[dbg] post push 6415744
当我更改返回状态的行时,我得到:
s_stateStack.push_back(std::move(ref));
[dbg] pre push 6415744
[dbg] move ctor 6415744
[dbg] post push 6415744
这使我深感困惑。
最佳答案
template <typename R>
inline Ref (const Ref<R> &other)
: m_ptr(other.m_ptr)
{
LogDebugc("copy ctor ", long(other.m_ptr));
Retain(m_ptr);
}
那不是复制构造函数。因此,它没有被调用。
编译器使用的是隐式生成的副本构造函数,而不是您编写的转换构造函数。