代码调用复制 ctor 通常必须调用移动 ctor

Code calls copy ctor where it normally had to call move ctor

本文关键字:调用 ctor 移动 常必须 代码 复制      更新时间:2023-10-16

我所拥有的基本上是一个std::map,其中包含指向Views的指针。

std::map<string,View*>  myViews;
template<typename T>
bool addView( string assocName , T&& view )
{
    typedef typename std::remove_reference<T>::type T2;
    typedef typename T2::View dummy; // check if T is subclass of 'View'
    // Remove any Current View
    View* &data = myViews[assocName]; // reference to pointer
    if( data )
        delete data; // Delete Current associated view
    // Insert the new View
    data = new T2( std::move(view) ); // <-- Here is the error
}

"addView"的调用方式如下:

viewSwitcher.addView( "3" , ScSetupPage3() );

我的问题是类"ScSetupPage3"没有复制ctor,但是"addView"尝试调用它!?

这是我的GNU GCC给我的错误msg:

error: use of deleted function 'ScSetupPage3::ScSetupPage3(const ScSetupPage3&)'

溶液:ScSetupPage3 没有默认的移动 ctor,因为它声明了一个非基元 ctor。因此,即使其成员可以被移动,甚至声明了移动,它也将被复制而不是移动。

std::move就是你要找的。如果可能的话,它基本上是右值的转换。

从我发现的实现来看,您似乎只犯了一个小错误,尝试自己进行强制转换:

template<class T> 
typename remove_reference<T>::type&&
std::move(T&& a) noexcept
{
  typedef typename remove_reference<T>::type&& RvalRef;
  return static_cast<RvalRef>(a);
} 

正如juanchopanza询问ScSetupPage3是否声明了移动ctor。我看到,它确实没有:

ScSetupPage3 没有默认的移动 ctor,因为它声明了一个非基元 ctor。因此,即使其成员可以被移动,甚至声明了移动,它也将被复制而不是移动。