【问题标题】:Why can't I call operator() on temporary objects directly?为什么我不能直接在临时对象上调用 operator() ?
【发布时间】:2017-05-27 09:09:48
【问题描述】:

我想要做的可以总结为以下代码:

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

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

【问题讨论】:

  • 做个天使,加入int main() ;-)
  • @Bathsheba,用-S编译就可以得到结果了XD
  • @YiFei 当然,但最好在您的问题中提供一个,这样我们就可以复制粘贴并测试您的代码。
  • @TartanLlama 那么好吧,把f改写为main。谢谢你的建议。
  • @Bathsheba “高于我的工资等级”我不太确定..

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


【解决方案1】:

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

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

B{a}(2);

【讨论】:

  • (B(a))(2);
  • 我会避免 operator() 然后...非常感谢。
  • IOW:如果它看起来像一个声明,它声明。模棱两可的解析被解析为声明,而不是表达式。
  • @YiFei:一开始这里看起来不太可读,是吗?为什么要使用运算符重载,其唯一目的是使代码更具可读性,但它却产生了相反的效果?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多