C++ 什么是纯函数?

C++ 什么是纯函数?,c++,function,predicate,C++,Function,Predicate,我发现这句话: 使其成为纯函数 谓词纯度:谓词是返回是/否答案的函数对象,通常作为布尔值。函数是纯函数 如果其结果仅取决于其参数,则具有数学意义 (注意,“纯”的使用与纯虚拟无关 功能) 不允许谓词保留或访问影响结果的状态 运算符()的,包括成员状态和全局状态。 更愿意将运算符()作为的常量成员函数 谓词(见项目15) 本声明中提到的纯函数是什么?有人能举例说明吗?提前感谢。这是一个纯函数: int foo(int n) { return n*2; } int i = 42; int b

我发现这句话:

  • 使其成为纯函数
  • 谓词纯度:谓词是返回是/否答案的函数对象,通常作为布尔值。函数是纯函数 如果其结果仅取决于其参数,则具有数学意义 (注意,“纯”的使用与纯虚拟无关 功能)

    不允许谓词保留或访问影响结果的状态 运算符()的,包括成员状态和全局状态。 更愿意将运算符()作为的常量成员函数 谓词(见项目15)


    本声明中提到的纯函数是什么?有人能举例说明吗?提前感谢。

    这是一个纯函数:

    int foo(int n)
    {
      return n*2;
    }
    
    int i = 42;
    
    int bar(int n)
    {
      ++i;
      return n*i;
    }
    
    调用它的结果只取决于它的参数

    这不是一个纯粹的函数:

    int foo(int n)
    {
      return n*2;
    }
    
    int i = 42;
    
    int bar(int n)
    {
      ++i;
      return n*i;
    }
    
    返回的值取决于参数以外的内容。

    函数是纯函数,如果:

  • 它没有语义上可观察到的副作用
  • 对于相同的输入,总是返回相同的结果
  • 因此函数仍然可以有一个状态,但它不应该是可见的。例如:

    int foo(std::vector<int> v) {
    
      static std::vector<int> tmp;
      tmp.resize(v.size);
    
      std::transform(v.begin(), v.end(), tmp.begin(), [](int a) {return a * a;});
      return std::accumulate(tmp.begin(), tmp.end(), 0);
    }
    
    intfoo(标准::向量v){
    静态std::向量tmp;
    tmp.调整大小(v.大小);
    std::transform(v.begin(),v.end(),tmp.begin(),[](inta){返回a*a;});
    返回std::accumulate(tmp.begin(),tmp.end(),0);
    }
    

    函数foo有一个状态(静态向量),但是它在语义上是不可观察的,因此它是纯向量。这是一个愚蠢的函数,但它应该说明这一点。

    引用提供了一个定义,因此不完全清楚您认为混淆的部分是什么?当然最简单的put函数是no op
    int f(int n){return n;}
    @EdHeal或just
    return 42