我有两个问题

  • 这两个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 = ...这样的额外定义。

    最佳答案



    是。



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



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



    在运行时,传递引用不会花费零时间。实际上,将引用参数传递给函数实际上是复制指针的地址(在您的情况下,可能为64位)并取消引用(假设您实际上访问了引用),这不仅仅是在传递参数的情况下进行复制。值指针。如果函数是由优化程序内联扩展的,则两种方法都可能没有区别。

    10-08 08:19
    查看更多