为什么调用带有未声明变量的仿函数有效?

Dan*_*ier 21 c++ compilation functor most-vexing-parse

class foo {
    public:
    bool operator () (int & i) {
        return true;
    }
};

int main() {
    foo(WhyDoesThisCompile);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当传递WhyDoesThisCompile(没有空格)到仿函数时,程序编译.

为什么是这样?我在clang 4.0.0上测试过它.

Lig*_*ica 30

你没有调用仿函数.

你正在宣布一个foo叫做的人WhyDoesThisCompile.

是的,尽管有括号.


我想你的意思是:

   foo()(WhyDoesThisCompile);
// ^^^^^
// temp ^^^^^^^^^^^^^^^^^^^^
//  of   invocation of op()
// type
// `foo`
Run Code Online (Sandbox Code Playgroud)

......没有.

  • 每隔几周,我们就会得到其中一个含糊不清/烦恼的解析问题:) (10认同)
  • @DanielCollier,语法来自C,但一般来说,你可以在声明中添加额外的括号.如果不使用类型别名或其他技巧,你有时也需要它们:`int(&arr)[2];`或`void(*f)(int);` (9认同)
  • 疯狂地混淆和反直觉.不相信这是合法的C++. (8认同)
  • @DeiDei见[dcl.decl]/4,它给出了声明的语法 - 一个`noptr-declarator`是一个`ptr-declarator`,而`(ptr-declarator)`是一个`noptr-declarator`,它是说你可以在任何声明者周围加上括号.例如`int*p;`和`int(((*((((((p))))))));`是相同的 (4认同)
  • @DanielCollier:没问题 - 享受银行! (2认同)