Подтвердить что ты не робот

Почему я не могу вызвать оператор() на временных объектах напрямую?

То, что я хочу сделать, можно обобщить на следующий код:

struct A{};

struct B{
    A& a;
    B(A& a) noexcept : a(a){}
    int operator()(int) {}
};

int main(){
    A a;
    B(a)(2);
}

И мой компилятор (g++ 6) отклонил код, жалующийся, что a затеняет параметр. Однако, если я попытаюсь явно вызвать operator(), он работает так, как ожидалось.

Кажется, что g++ будет игнорировать круглые скобки и увидеть инструкцию как объявление.

Является ли это указанным или ожидаемым поведением?

4b9b3361

Ответ 1

Это один из тех правил icky parsing, который ловит вас все время от времени. Как вы полагаете, B(a)(2); на самом деле эквивалентен B a(2);, поэтому ваш код пытается инициализировать B с помощью int.

Чтобы исправить это, вы можете использовать стандартную инициализацию С++ 11:

B{a}(2);