Мне интересно, гарантируется ли следующее поведение (см. Утверждения) стандартом 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]: ... Указатели на объекты или функции одного типа (после преобразования указателей) можно сравнивать на равенство.Два указателя одного типа сравниваются равными, если и только если они оба равны нулю, оба указывают на одну и ту же функцию или оба представляют один и тот же адрес (3.9.2).
Однако яне уверен, какова ситуация, когда указатель функции указывает на лямбда-функцию, потому что лямбды каждый раз называются уникальными объектами.