Рассмотрим этот пример кода:
#include <iostream>
#include <functional>
typedef std::function<void()> func1_t;
typedef std::function<void(int)> func2_t;
struct X
{
X (func1_t f)
{ }
X (func2_t f)
{ }
};
int main ( )
{
X x([](){ std::cout << "Hello, world!\n"; });
}
Я был уверен, что он не должен компилироваться, потому что компилятор не должен выбирать один из двух конструкторов. g++ - 4.7.3 показывает это ожидаемое поведение: он говорит, что вызов перегруженного конструктора неоднозначен. Однако g++ - 4.8.2 успешно компилирует его.
Является ли этот код правильным в С++ 11 или это ошибка/особенность этой версии g++?