gpt4 book ai didi

c++ - 为什么指向函数的指针不能绑定(bind)到左值引用,而函数可以?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:37 24 4
gpt4 key购买 nike

使用带和不带符号的函数名有什么区别?我注意到它们在绑定(bind)到模板参数时以不同的方式表现:

void foo();
template <typename F> void bind(F&);
bind(foo); // OK
bind(&foo); // Error

为什么会这样?这些情况下的推导类型是什么?

最佳答案

注意内置的operator&将返回 T* 类型的 prvalue。所以 &foo 将返回一个类型为 void (*)() 的函数指针,它是一个纯右值,不能绑定(bind)到非常量的左值引用;这正是 bind() 期望的参数,然后它失败了。

对于bind(foo),template pamareter F 将被推导为函数类型(即void()),然后bind 的参数类型将为 void(&)(),因此它有效。

您可能认为 foo&foo 应该具有相同的效果,因为函数到指针的衰减。但请注意,bind() 的参数被声明为按引用传递。然后对于 bind(foo),函数到指针的衰减不会发生,这就是为什么参数类型被推断为对函数的引用。另一方面,对于 bind(&foo),显式调用 operator& 返回一个函数指针纯右值,它不能传递给 bind().

如果参数声明为按值传递,函数到指针的衰减发生,则 bind(foo)bind(&foo) 将具有效果相同,两者都可以正常工作。

void foo();
template <typename F> void bind(F);
bind(foo); // OK, F=void(*)()
bind(&foo); // same as above

关于c++ - 为什么指向函数的指针不能绑定(bind)到左值引用,而函数可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41853388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com