我有两个问题
这两个setEvalFunction的声明是否等效
对于using EvalFunctionPtr = T (*)(const std::vector<T>&);
?
a) void setEvalFunction(const EvalFunctionPtr& evalFunc);
b) void setEvalFunction(T (* const &evalFunc)(const std::vector<T>&));
以下参数之间有什么区别(因为两者似乎都能正常工作)。
a) T (* const &evalFunc)(const std::vector<T>&)
b) T (* const &evalFunc)(const std::vector<T>&)&
我希望得到等于1 a的东西,即将引用传递给常量函数指针,但不使用像using EvalFunctionPtr = ...
这样的额外定义。
答案 0 :(得分:1)
- 这两个声明均为
醇>setEvalFunction
等效
是
- 以下参数之间有什么区别(因为两者似乎都能正常工作)。
醇>
我相信2. b)R (* const & fptr)(/*args*/)&
格式错误,因为(非成员)函数指针不能有ref-qualifier,这是最终&
所表示的。但是,可能由于编译器错误,我的GCC确实接受它并将其解析为与R (* const & fptr)(/*args*/)
相同。编辑:clang正确拒绝编译它。
我希望得到相当于1 a的东西,即将引用传递给常量函数指针,但不使用像
EvalFunctionPtr = ....
那样的额外定义
这是非常恰当的描述1. b)。
传递函数指针的值是传递64位整数(在我的64位系统中),这与传递函数指针的引用不同,因为引用是由编译器应用的,并且运行时间为零。但是整数的副本需要时间,不是吗?
传递引用在运行时不会占用零时间。事实上,将一个引用参数传递给一个函数实际上是复制指针的(可能是你的64位)地址并取消引用它(假设你实际访问了引用),这不仅仅是在传递的情况下复制按值指针。如果函数是由优化器内联扩展的,那么两种方式之间可能没有区别。