我怀疑在下面的代码中,由于一个最令人烦恼的解析问题,使用构造函数参数和函数调用操作符参数调用临时函数对象是不明确的。
#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
。
答案 0 :(得分:2)
不幸的是Fun(a)(b);
可以解析为Fun a(b);
这是一个声明,而不是临时对象。
答案 1 :(得分:1)
理解函数声明语法的简单示例:
#include <iostream>
void (foo)(int a) {
std::cout << a << std::endl;
}
int main() {
foo(5);
}
所以在你的情况下你必须使用它:
Fun(a).operator()(b);
(Fun(a))(b);