Лямбда-функции в качестве базовых классов

Играя с Lambdas, я обнаружил интересное поведение, которое я до конца не понимаю.

Supose у меня естьstruct Overload который получается из 2 параметров шаблона и имеетusing F1::operator(); пункт.

Теперь, если я получаю из двух функторов, я могу получить доступ только к оператору () F1 (как я и ожидал)

Если я наследую две лямбда-функции, это уже не так: я могу получить доступ к operator () из F2.

#include <iostream>

// I compiled with g++ (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8)
//
// g++ -Wall -std=c++11 -g main.cc
// g++ -Wall -std=c++11 -DFUNCTOR -g main.cc
// 
// or clang clang version 3.3 (tags/RELEASE_33/rc2)
// 
// clang++ -Wall -std=c++11 -g main.cc
// clang++ -Wall -std=c++11 -DFUNCTOR -g main.cc
// 
// on a Linux localhost.localdomain 3.9.6-200.fc18.i686 #1 SMP Thu Jun 13 
// 19:29:40 UTC 2013 i686 i686 i386 GNU/Linux box


struct Functor1
{
    void operator()() { std::cout << "Functor1::operator()()\n"; }
};

struct Functor2
{
    void operator()(int) { std::cout << "Functor2::operator()(int)\n"; }
};

template <typename F1, typename F2>
struct Overload : public F1, public F2
{
    Overload()
        : F1()
        , F2() {}

    Overload(F1 x1, F2 x2)
        : F1(x1)
        , F2(x2) {}

    using F1::operator(); 
};

template <typename F1, typename F2>
auto get(F1 x1, F2 x2) -> Overload<F1, F2>
{
   return Overload<F1, F2>(x1, x2);
}


int main(int argc, char *argv[])
{
    auto f = get(Functor1(), Functor2());

    f();
#ifdef FUNCTOR
    f(2); // this one doesn't work IMHO correctly
#endif

    auto f1 = get(
                  []() { std::cout << "lambda1::operator()()\n"; },
                  [](int) { std::cout << "lambda2::operator()(int)\n"; }
                  );
    f1();
    f1(2); // this one works but I don't know why


  return 0;
}

Стандарт гласит, что:

Тип лямбда-выражения (который также является типом объекта замыкания) является уникальным безымянным типом класса, не являющимся объединением.

Таким образом, каждый тип лямбды должен быть уникальным.

Я не могу объяснить, почему это так: кто-нибудь может пролить свет на это, пожалуйста?

Ответы на вопрос(2)

Ваш ответ на вопрос