std :: visit с лямбдами вместо класса посетителя

Глядя на этот пример для std :: visit из cppreference, мне трудно понять, как именно это компилируется и работает. В строке 12 определен шаблон функции «перегружен», но реализация для функции не предоставляется. Эта функция каким-то образом (?) Используется std :: visit в строке 17 для определения типа «структуры, перегруженной» на основе трех лямбда-выражений.

Как это работает?

И что я действительно понял, так это то, что функция шаблона «перегружена» должна иметь то же имя, что и «структура перегружена», чтобы она могла компилироваться. Как это связано? Я думал, что «функция шаблона перегружена» была использована для объявления типа «структура перегружена» для компилятора. Но тогда я не понимаю, почему фигурные скобки должны использоваться в строке 17. Почему не функциональные скобки?

Почему это работает, ускользает от меня.

#include <iomanip>
#include <iostream>
#include <string>
#include <variant>
#include <vector>

template<class T> struct always_false : std::false_type {};

using var_t = std::variant<int, long, double, std::string>;

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;     // Line 12

int main() {
    std::vector<var_t> vec = {10, 15l, 1.5, "hello"};
    for (auto& v: vec) {
        std::visit(overloaded {                                       // Line 17
            [](auto arg) { std::cout << arg << ' '; },
            [](double arg) { std::cout << std::fixed << arg << ' '; },
            [](const std::string& arg) { std::cout << std::quoted(arg) << ' '; },
        }, v);
    }
}   

person Generic Name    schedule 17.12.2017    source источник
comment
В строке 12 определен шаблон функции «перегружен» Это не функция шаблона.   -  person Nicol Bolas    schedule 17.12.2017
comment
Спасибо. Руководства по дедукции для меня совершенно внове.   -  person Generic Name    schedule 18.12.2017