首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将函数转换为成员函数

将函数转换为成员函数
EN

Stack Overflow用户
提问于 2019-11-23 19:35:19
回答 1查看 72关注 0票数 0

我希望将函数转换为成员函数,然后调用它,但是self对这个self_3 = self_1 + self_2做了一些调整。

代码语言:javascript
运行
复制
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;
}

原因是什么?如何正确地做这件事?

EN

Stack Overflow用户

回答已采纳

发布于 2019-11-23 20:03:32

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

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

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

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

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

此外,对空指针值调用成员函数还会导致未定义的行为,并允许编译器任意操作。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59011443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档