代码调用复制 ctor 通常必须调用移动 ctor
Code calls copy ctor where it normally had to call move ctor
我所拥有的基本上是一个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。因此,即使其成员可以被移动,甚至声明了移动,它也将被复制而不是移动。
相关文章:
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 调用了Copy ctor而不是move ctor
- 为什么部分初始化一个类然后调用委托 ctor 失败?
- 为什么调用不明确的 ctor 时没有编译时错误?
- 为什么编译器在调用 move 后选择复制 ctor
- 如何调用模板类的模板CTOR
- 是否应在调用基本CTOR时复制继承的构造函数
- Move-CTOR和COPY-CTOR未调用
- 避免在 ctor 初始值设定项列表中的字符串赋值中使用双重调用函数
- 为什么当我创建 N 个对象的向量时不调用 N 次 CTOR
- 警告在 std::move'ing 时调用复制 ctor
- 析构函数是移动ctor/赋值的RHS上唯一调用过的东西吗
- 没有匹配的函数调用CTOR,多重继承
- CPP 多重继承意外调用 CTOR
- 当使用类型为"类&&"的变量作为参数时,为什么调用复制 ctor 而不是移动 ctor
- 以下内容中调用了复制ctor的次数
- 我实际上是在调用 ctor 并在指向对象的指针上初始化 vtable 吗?C++
- C++11:调用移动 ctor/operator= 时
- 从基类的静态模板方法中调用继承类的受保护 ctor 失败
- 有没有办法在.cpp中初始化/调用 CTOR