在对临时函数对象的调用中解析歧义

时间:2012-10-05 08:46:31

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

我怀疑在下面的代码中,由于一个最令人烦恼的解析问题,使用构造函数参数和函数调用操作符参数调用临时函数对象是不明确的。

#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

2 个答案:

答案 0 :(得分:2)

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

请参阅Most vexing parse

答案 1 :(得分:1)

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

#include <iostream>

void (foo)(int a) {
   std::cout << a << std::endl;
}

int main() {
   foo(5);
}

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

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