指向lambda函数的函数指针的相等性

帕维尔·瓦兹哈罗夫

我想知道C ++标准是否可以保证以下行为(请参见断言)?似乎它可以在最新版本的clang和gcc下工作,但是我仍然不确定它的标准定义行为或实现是否定义了它。

#include <cassert>
#include <functional>

struct test
{
    using fn_ptr_t = int(*)(int);

    fn_ptr_t fn_ = nullptr;

    template<auto Fun>
    void assign() noexcept
    {
        fn_ = +[](int i)
        {
            return std::invoke(Fun, i);
        };
    }
};

int fun(int i) { return i; }
int gun(int i) { return i; }

int main()
{
    test t0, t1, t2;

    t0.assign<&fun>();
    t1.assign<&fun>();
    t2.assign<&gun>();

    assert(t0.fn_ == t1.fn_);
    assert(t0.fn_ != t2.fn_);

    return 0;
}

我发现该标准对函数指针说了以下几点:

C ++ 03 5.10 / 1 [expr.eq]:...可以比较指向相同类型的对象或函数的指针(在指针转换之后)是否相等。当且仅当两个指针都为null,都指向相同的函数或都表示相同的地址(3.9.2)时,两个相同类型的指针才会比较相等。

但是,我不确定函数指针指向lambda函数时会发生什么情况,因为每次都将lambda称为唯一对象。

火箭1111

没错,lambda是唯一的,这正是第二个断言通过的原因。但是它们在每次评估中并不总是不同的:

template <typename>
auto get() { return []{}; }

auto l1 = get<int>();
auto l2 = get<long>();
auto l3 = get<int>();

static_assert(std::is_same_v<decltype(l1), decltype(l2)>); // fails
static_assert(std::is_same_v<decltype(l1), decltype(l3)>); // passes

// caveat: needs C++20
l1 = l2; // no, different lambdas
l1 = l3; // ok, same lambda

在你的情况下,函数指针t0t1是一样的,因为他们都是通过分配assign<&fun>,其中拉姆达具有总是相同的类型。

由于它们具有相同的类型operator(),因此它们具有相同的类型,因此两个函数指针都相同(它们指向相同的operator())。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

获取指向lambda的函数指针?

来自分类Dev

空指针可以指向lambda函数吗?

来自分类Dev

使用C ++ Lambda指向成员函数的指针

来自分类Dev

指向void函数的指针

来自分类Dev

指向成员函数的指针

来自分类Dev

发送指向函数的指针

来自分类Dev

指向成员函数的指针

来自分类Dev

[[nodiscard]]指向函数指针

来自分类Dev

指向函数转换的指针

来自分类Dev

指向成员函数的函数指针

来自分类Dev

指向成员函数的函数指针

来自分类Dev

指向函数指针数组的指针

来自分类Dev

dladdr:指向函数的指针与指向对象的指针

来自分类Dev

C ++如何获取指向lambda函数的void指针?

来自分类Dev

如何拥有指向通用lambda的函数指针?

来自分类Dev

指向函数的指针,返回函数指针

来自分类Dev

将指向lambda函数的指针分配给指向另一个lambda函数的指针

来自分类Dev

指向函数调用的指针与指向成员函数调用的指针

来自分类Dev

指向结构的函数的指针,指向typedef的函数的指针

来自分类Dev

是否可以比较两个指向成员函数的指针是否相等?

来自分类Dev

从函数返回指向结构的指针

来自分类Dev

指向成员函数的指针的向量

来自分类Dev

指向成员函数的指针-语法

来自分类Dev

指向void *函数的指针C ++

来自分类Dev

指向C ++中函数的指针

来自分类Dev

指向函数的常量指针数组

来自分类Dev

创建指向类的指针的函数

来自分类Dev

指向类成员函数的指针

来自分类Dev

指向函子的函数指针