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

时间:2017-01-12 10:02:03

标签: c++ compiler-errors g++ operator-keyword

我想要做的事情可归纳为以下代码:

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++将忽略括号并将该语句视为声明。

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

1 个答案:

答案 0 :(得分:21)

这是那些icky解析规则之一,一次又一次地抓住你。根据您的建议,B(a)(2);实际上等同于B a(2);,因此您的代码会尝试使用B初始化int

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

B{a}(2);