c++ - 将函数转换为成员函数

标签 c++ pointer-to-member

我想将函数转换为成员函数然后调用它,但是 self 对此 self_3 = self_1 + self_2 进行了一些调整

struct Foo {};

namespace FooExt {
    Foo* getSelf(Foo *self) {
        return self;
    }
};

template <typename R, typename T, typename... Args>
auto f2mf(R(func)(T*, Args...)) -> R(T::*)(Args...) {
    return (R(T::*&)(Args...)) func;
}

int main() {
    auto getSelf = f2mf(FooExt::getSelf); // getSelf: (Foo* (Foo::*)(Foo* const)) 0x557f0a9ac210 <FooExt::getSelf(Foo*)>, this adjustment 140735536657056

    Foo f{};

    auto self_1 = &f;
    auto self_2 = (((Foo*) nullptr)->*getSelf)();
    auto self_3 = (f.*getSelf)();

    return 0;
}

原因是什么?如何正确执行此操作?

最佳答案

下面的推理是错误的,因为 1. 成员函数指针不是函数指针,并且 2. 您实际上不是转换为成员函数指针类型,而是转换为成员函数指针引用类型。

当您从强制转换获得的引用中初始化 f2mf 的返回值时,这里的未定义行为就已经发生了。它访问具有错误类型的引用指针,导致别名冲突和未定义的行为。


将函数指针显式转换为另一种函数指针类型的结果是未指定的,除非转换回原始类型会产生原始指针值。

通过指向不等于原始函数类型的函数类型的指针调用函数会导致未定义的行为。

因此,您的编译器可以对代码中的指针值做任何它想做的事情。

此外,在空指针值上调用成员函数也会导致未定义的行为,并且还允许编译器做任何它想做的事。

关于c++ - 将函数转换为成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59011443/

相关文章:

c++ - 跟踪循环中的最小值和最大值

c++ - 即使 int 被 10^9+7 模数也会溢出

C++ 指向使用模板的非静态成员函数的指针

c++ - 重载指向模板的成员函数指针

c++ - Arduino 自动驾驶汽车 if 语句(超声波)

c++ - 修改文本输入中的特定字符 (C++)

c++ - 通过使用 OpenCV 单击图像中的一个点来访问像素值

c++ - 函数指针 : *(void**) (&fun) = dlsym (lib, "fun") 它是如何工作的?

c++ - 允许通过指向方法的成员参数的指针指向的成员类型的模板参数推导

c++ - 为什么自由函数指针总是指针类型,而成员函数指针实际上不是指针?