繁体   English   中英

指向具有移动语义的成员函数的指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM