Разбор неоднозначности при вызове временного объекта функции

Я подозреваю, что в приведенном ниже коде вызов временного объекта функции как с аргументом конструктора, так и с аргументом оператора вызова функции является каким-то двусмысленным из-за проблемы с наиболее неприятным синтаксическим анализом.

#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,

1

Решение

к несчастью Fun(a)(b); может быть проанализирован как 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);
1

По вопросам рекламы [email protected]