【问题标题】:Parsing ambiguity in a call to a temporary function object解析对临时函数对象的调用中的歧义
【发布时间】:2012-09-26 09:32:44
【问题描述】:

我怀疑在下面的代码中,由于最棘手的解析问题,使用构造函数参数和函数调用运算符参数调用临时函数对象在某种程度上是模棱两可的。

#include <iostream>

class Fun
{
public:
        explicit Fun(int i): v_(i) {}

        void operator()(int j) const 
        { 
                std::cout << (v_ + j) << "\n"; 
        }

private:
        int v_; 
};

int main()
{
        int a = 1;
        int b = 2;

        Fun(a)(b);   // ERROR: conflicting declaration 'Fun a'
        (Fun(a))(b); // OK: prints 3
        return 0;
}

Ideone 上的输出。

添加像(Fun(a))(b) 这样的括号可以解决问题,但我不太明白Fun(a)(b) 是如何被解析为声明Fun a

【问题讨论】:

    标签: c++ constructor arguments most-vexing-parse function-object


    【解决方案1】:

    很遗憾,Fun(a)(b); 可以解析为 Fun a(b);,这是一个声明,而不是临时对象。

    Most vexing parse

    【讨论】:

    • +1,谢谢。编译器消息可能会更清楚一点,然后说“冲突声明 Fun a(b)”!
    • @rhalbersma,C++11 扩展了初始化列表以使初始化明确。 Fun{a}(b) 将按预期进行解析。
    【解决方案2】:

    理解函数声明语法的简单示例:

    #include <iostream>
    
    void (foo)(int a) {
       std::cout << a << std::endl;
    }
    
    int main() {
       foo(5);
    }
    

    所以在你的情况下你必须使用这个:

    Fun(a).operator()(b); 
    (Fun(a))(b);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 2015-12-14
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多