理解c ++中的函数指针语法

时间:2016-10-29 18:30:35

标签: c++ c++11 function-pointers

我有两个问题

  1. 这两个setEvalFunction的声明是否等效 对于using EvalFunctionPtr = T (*)(const std::vector<T>&);

    a) void setEvalFunction(const EvalFunctionPtr& evalFunc);
    
    b) void setEvalFunction(T (* const &evalFunc)(const std::vector<T>&));
    
  2. 以下参数之间有什么区别(因为两者似乎都能正常工作)。

    a) T (* const &evalFunc)(const std::vector<T>&)
    
    b) T (* const &evalFunc)(const std::vector<T>&)&
    
  3. 我希望得到等于1 a的东西,即将引用传递给常量函数指针,但不使用像using EvalFunctionPtr = ...这样的额外定义。

1 个答案:

答案 0 :(得分:1)

  
      
  1. 这两个声明均为setEvalFunction等效
  2.   

  
      
  1. 以下参数之间有什么区别(因为两者似乎都能正常工作)。
  2.   

我相信2. b)R (* const & fptr)(/*args*/)&格式错误,因为(非成员)函数指针不能有ref-qualifier,这是最终&所表示的。但是,可能由于编译器错误,我的GCC确实接受它并将其解析为与R (* const & fptr)(/*args*/)相同。编辑:clang正确拒绝编译它。

  

我希望得到相当于1 a的东西,即将引用传递给常量函数指针,但不使用像EvalFunctionPtr = ....那样的额外定义

这是非常恰当的描述1. b)。

  

传递函数指针的值是传递64位整数(在我的64位系统中),这与传递函数指针的引用不同,因为引用是由编译器应用的,并且运行时间为零。但是整数的副本需要时间,不是吗?

传递引用在运行时不会占用零时间。事实上,将一个引用参数传递给一个函数实际上是复制指针的(可能是你的64位)地址并取消引用它(假设你实际访问了引用),这不仅仅是在传递的情况下复制按值指针。如果函数是由优化器内联扩展的,那么两种方式之间可能没有区别。