1

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

#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

4

2 回答 2

2

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

查看最令人头疼的解析

于 2012-10-05T08:52:02.170 回答
1

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

#include <iostream>

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

int main() {
   foo(5);
}

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

Fun(a).operator()(b); 
(Fun(a))(b);
于 2012-10-05T08:53:28.460 回答