У меня возникают проблемы с std:: функциями, созданными из lambdas, если функция возвращает ссылку, но тип возврата явно не вызывается как ссылка. Кажется, что std:: function создается отлично без предупреждений, но после ее вызова возвращается значение, когда ожидается ссылка, в результате чего вещи взорвутся. Здесь очень надуманный пример:
#include <iostream>
#include <vector>
#include <functional>
int main(){
std::vector<int> v;
v.push_back(123);
std::function<const std::vector<int>&(const std::vector<int>&)> callback =
[](const std::vector<int> &in){return in;};
std::cout << callback(v).at(0) << std::endl;
return 0;
}
Это выдает мусор, однако если лямбда изменена, чтобы явно возвращать ссылку на константу, она работает нормально. Я могу понять, что компилятор думает, что лямбда возвращается по значению без подсказки (когда я изначально столкнулся с этой проблемой, лямбда прямо возвращала результат из функции, которая возвращала ссылку на const, и в этом случае я бы подумал, что const reference return lambda будет выводимым, но, по-видимому, нет.) Я удивлен тем, что компилятор позволяет построить std:: function из лямбда с несоответствующими типами возврата. Ожидается ли такое поведение? Я что-то пропускаю в стандарте, который допускает такое несоответствие? Я вижу это с g++ (GCC) 4.8.2, не пробовал ни с чем другим.
Спасибо!