代码调用复制ctor通常必须调用move ctor

时间:2013-09-14 17:14:00

标签: c++ c++11 move-semantics

我所拥有的基本上是一个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给了我:

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

解决方案: ScSetupPage3没有默认的移动ctor,因为它声明了一个非原始的ctor。因此,即使其成员可能被移动或甚至宣布移动者,它也会被复制而不会移动,因为缺少适当的ctor。

2 个答案:

答案 0 :(得分:1)

std::move正是您要找的。如果可能的话,它基本上是一个rvalue的演员。

从我发现的一个实现中,你似乎只是犯了一个小错误,试图自己做演员:

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);
} 

答案 1 :(得分:1)

由于juanchopanza询问ScSetupPage3是否有移动ctor声明。我看到,它确实没有一个:

ScSetupPage3没有默认的移动ctor,因为它声明了一个非原始的ctor。因此,即使其成员可能被移动或甚至宣布移动者,它也会被复制而不会移动,因为缺少适当的ctor。