当前位置: 首页 > 知识库问答 >
问题:

为什么无状态函子的运算符()不能是静态的?

宗意蕴
2023-03-14

为什么无状态仿函数的运算符()不允许是静态?无状态lambda对象可转换为指向与其运算符()具有相同签名的自由函数的指针。

StephanT.Lavavej在第6页指出,到函数指针的转换只是一个操作符FunctionPointer()。但对于非成员函数,我无法获得指向操作符()的相应指针。对于functorstruct F{void operator()(){}}来说,似乎无法转换

代码:

struct L
{
    static
    void operator () () const {} 
    operator auto () const
    { 
        return &L::operator ();
    }
};

错误是

重载的“运算符()”不能是静态成员函数

但是操作符()没有重载。

共有3个答案

齐乐
2023-03-14

我看不出有任何技术理由禁止静态自动运算符()(...)。但这是一种特殊情况,因此添加对它的支持会使标准复杂化。这种复杂性是不必要的,因为它很容易模拟:

struct L
{
    static void func() {}

    void operator()() const { func(); }

    operator auto () const
    { 
        return &L::func;
    }
};

有关一些可能有用的额外信息,请参阅Johannes的回答。

翟迪
2023-03-14

我认为没有技术上的理由禁止这一点(但不熟悉事实上的跨供应商C ABI(安腾ABI),我不能保证任何事情)。

然而,https://cplusplus.github.io/EWG/ewg-active.html#88有一个关于这个的进化问题。它甚至有[微小的]标记,这使得它成为一个正在考虑的有点“琐碎”的特性。

齐英耀
2023-03-14

根据标准13.5/6,

运算符函数要么是非静态成员函数,要么是非成员函数,并且至少有一个参数,其类型是类、对类的引用、枚举或对枚举的引用。

此外,13.5.4中规定

运算符()应为具有任意数量参数的非静态成员函数。它可以有默认参数。它实现了函数调用语法postfix expression(expression list opt),其中postfix表达式的计算结果为类对象,并且可能为空的表达式列表与类的operator()成员函数的参数列表相匹配。因此,调用x(arg1,…)解释为x.运算符()(arg1,…)对于类型为T的类对象x

 类似资料:
  • 根据我的理解,Flink中的运算符有源运算符、转换运算符等。我对Flink中运算符的理解正确吗? 在运算符状态下,Flink是维护每个运算符的状态(如针对每个作业/任务的map(),reduce()等),还是维护一个完成的作业/任务的状态?还有,如果我的作业是以多个并行提交的,那么每个槽会有自己的状态吗?

  • 谁能告诉我为什么函数参数不能是?这是函数参数在上声明并在函数返回时被取消分配的原因吗?没有办法保留参数值?只是糊涂了。请澄清。 多谢了。

  • 伙计们,我有一个简单但令人讨厌的问题。据我所知,基本上意味着,对于该类的每个实例,这个方法将是相同的,如果我们改变它,这将改变该类的每个实例,它也被称为类方法。那么,如果我有一个类,它实现了某种格式的方法,让我们说: 为什么不能设置为静态?因为该类的每个实例的格式都是相同的。。。?

  • 问题内容: 为什么我的内部类中没有接口?为什么是天生的?抱歉,如果这是一个愚蠢的问题,我已经尽力一遍又一遍地用Google搜索,但似乎无法将其包裹在脑海中。如为什么不能在内部类/局部类中声明这些? 同样作为一个确认,我们在接口中可以包含静态最终变量的原因是因为它们未指定状态或任何此类实现权?如果我们输了而只使用了final,那么我们需要一个没有意义的实例,因为您无法实例化接口。抱歉,我真的很困惑,

  • 问题内容: 我开始用Java编程。 一本书说,在这种情况下,我应该使用static,但没有明确说明为什么应该使用静态方法或含义。 你能澄清一下吗? 问题答案: 的概念与某物是类的一部分还是对象(实例)有关。 对于声明为的方法,它表示该方法是一个类方法- 该方法是类的一部分,而不是对象的一部分。这意味着另一个类可以通过引用来调用另一个类的类方法。例如,调用的run方法可以通过以下方式完成: 另一方面

  • 问题内容: 除了“正在运行”,“已暂停”和“已停止”以外,是否还有其他状态? 问题答案: 不,还有其他可能的状态。该docker窗远程API定义以下状态: 已创建(例如,使用)但尚未启动的容器 正在重新启动的容器 当前正在运行的容器 进程已暂停的容器 运行并完成的容器(在其他情况下为“停止”,尽管从技术上讲,容器也是“停止”的) 守护程序尝试且无法停止的容器(通常是由于容器使用了繁忙的设备或资源)