[英]In C++, is there any way to reduce the number of member functions with move semantics?
[英]pointers to member functions with move semantics
当您有一个指向堆栈上 object 的非静态成员 function 的指针时,当 object 由于移动而改变其位置时,究竟会发生什么? 指针是否仍指向从 object 移动的位置,因此无效/悬空?
指向成员函数的指针不包含对 class 的任何实例的引用。 即使对于指向非静态成员函数的指针也是如此。
这样的指针可以在没有 class 的实例的情况下构造:
class star {
public:
void shine();
};
void (star::* smile)() = &sun::shine;
并且调用时需要指定一个实例:
star sun;
(sun.*smile)();
std::memfn(smile)(sun);
object 不会“更改其位置”。 当发生移动时,被移动的 object 的 state 使用一些未指定的机制(由对象的移动构造函数或移动赋值运算符控制)被转移到被移动到的 object。 在某些有效但未指定的 state 中,被移出的 object 继续正常存在。
一个简单的例子是std::vector
。 std::vector
的移动语义的经典实现涉及交换向量内容的内部指针和大小。 在过程结束时,被移动的向量是一个有效的std::vector
,它具有被移动到的向量的内容(被移动到的向量具有被移动到的向量的内容)。
如果您有一个指向从 object 移出的指针,则该指针仍指向 object,在某些有效但未指定的 state 中。 这种情况一直存在,直到被移动的 object 被实际销毁。 在自动 scope 中的 object 的情况下,当执行线程离开 scope 和自动 ZA8Z6.FDE6331C4B6626AC 时,通常会发生这种情况发生这种情况时,您会留下一个悬空指针,这与任何其他情况没有什么不同,因为任何其他情况都会让您拥有一个指向不再存在的 object 的悬空指针。
当您有指向堆栈上 object 的非静态成员 function 的指针时,
您不能拥有指向特定对象的成员函数的指针。 以下是无效的,不会编译:
struct obj {
void f();
};
void func()
{
obj o;
using func_ptr = void (obj::*)();
f_ptr pointer_to_o_f = &o::f; // Error
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.