gpt4 book ai didi

c++ - 这两个函数签名有什么区别?

转载 作者:搜寻专家 更新时间:2023-10-31 01:01:07 27 4
gpt4 key购买 nike

有人告诉我here这两个签名之间的差异与左值/右值无关。

#include <iostream>

template <typename RET_TYPE, typename...ARGs>
void takeFunction(RET_TYPE(*&& /*function*/)(ARGs...))
{
std::cout << "RValue function" << std::endl;
}

template <typename RET_TYPE, typename...ARGs>
void takeFunction(RET_TYPE(*& /*function*/)(ARGs...))
{
std::cout << "LValue function" << std::endl;
}

void function()
{
}

int main()
{
void(*f)() = function;
takeFunction(&function);
takeFunction(f);
return 0;
}

但如果不是那样,那么它匹配的区别是什么?

最佳答案

函数函数指针是有区别的。

函数是不同的,因为它们不是对象(在这个词的标准意义上)。没有 function 右值这样的东西(除了涉及非静态成员函数的某些奇怪情况之外)。事实上,对函数的右值引用是左值,无论是否命名。

指向函数的指针就是指针,也就是对象。您可以拥有指向函数类型的指针的纯右值,或指向函数类型的指针的亡值,或指向函数类型的指针的左值。 &function 创建指向函数的纯右值指针;在 void (*f)() = function; 中,函数到指针的转换用于将函数左值 function 转换为指向函数的纯右值指针,其中f 已初始化。

现在考虑这组重载:

template <typename RET_TYPE, typename...ARGs>
void takeFunctionRef(RET_TYPE(&& /*function*/)(ARGs...)) // #1
{
std::cout << "RValue function" << std::endl;
}

template <typename RET_TYPE, typename...ARGs>
void takeFunctionRef(RET_TYPE(& /*function*/)(ARGs...)) // #2
{
std::cout << "LValue function" << std::endl;
}

takeFunctionRef(function); // calls #2
takeFunctionRef(std::move(function)); // still calls #2!

之所以选择重载 #2,是因为 [over.ics.rank] 项目符号 3.1.4 中的特殊决胜局,它倾向于将左值引用绑定(bind)到函数左值而不是将右值引用绑定(bind)到函数左值。但两者都会成功绑定(bind)(即,如果您删除 #2,您会看到在这两种情况下都会调用 #1)。

关于c++ - 这两个函数签名有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29726699/

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