为什么我不能直接在临时对象上调用 operator()?

Why can't I call operator() on temporary objects directly?

我想做的事情可以概括为以下代码:

struct A{};

struct B{
    A& a;
    B(A& a) noexcept : a(a){}
    int operator()(int) {}
};

int main(){
    A a;
    B(a)(2);
}

我的编译器 (g++ 6) 拒绝了抱怨 a 隐藏参数的代码。但是,如果我尝试显式调用 operator(),它会按预期工作。

好像g++会忽略括号,把语句当成声明。

这是指定的还是预期的行为?

这是那些时不时地抓住你的讨厌的解析规则之一。正如您所建议的,B(a)(2); 实际上等同于 B a(2);,因此您的代码尝试使用 int.

初始化 B

要解决此问题,您可以使用 C++11 的统一初始化:

B{a}(2);