Разрешение перегрузки для унаследованных функций - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу иметь структуру, которая принимает произвольное количество лямбд и служит центральной точкой вызова для всех их операторов вызова.

Если оператор вызова вызывается со списком аргументов, который не соответствует ни одной из лямбд, заданных в конструкции, должен вызываться оператор вызова по умолчанию.

Я думал, что следующий код достигнет именно этого. Оператор вызова для каждой лямбды «поднимается» в класс Poc через using.

template <typename ...Lambdas>
struct Poc : Lambdas...
{
    using Lambdas::operator() ...; // Lift the lambda operators into the class

    template <typename ...Ts>
    auto operator() (Ts...)
    {
        std::cout << "general call" << std::endl;
    }
};

// Deduction guide
template <typename ...Ts>
Poc(Ts... ts)->Poc<Ts...>;

int main()
{
    auto l_int = [](int) {std::cout << "int" << std::endl; };

    Poc poc{l_int};
    poc(1);//calls the default operator. why?

    return 0;
}

Когда в структуре нет оператора вызова по умолчанию, все работает как положено (с действительными списками аргументов). Если я добавлю его в структуру (как в коде выше), оператор по умолчанию будет вызываться каждый раз, независимо от того, с какими аргументами я его вызываю.

В моем понимании лямбда-операторы вызова и операторы вызова структуры (по умолчанию) присутствуют в одной и той же области видимости. Следовательно, все они должны рассматриваться для разрешения перегрузки. Поскольку оператор lamdba более специфичен, чем общий оператор по умолчанию, его следует выбрать.

Видимо, это не так. Почему это?

Я тестировал на Microsoft Visual C ++ , Clang и GCC (все в их последних версиях).

Edit:

1 Ответ

0 голосов
/ 06 ноября 2018

Когда вы замечаете это, все просто: ваш оператор не квалифицирован const, в то время как лямбда-единица (если вы не определите лямбду как mutable). Следовательно, он лучше подходит для вашего неконстантного экземпляра Poc.

Просто добавьте недостающие const:

auto operator() (Ts...) const
...