У меня проблемы с std :: functions, созданными из лямбда-выражений, если функция возвращает ссылку, но тип возвращаемого значения не вызывается явно как ссылка. Кажется, что 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;
}
Это выводит на печать мусор, однако, если лямбда изменена для явного возврата ссылки на константу, она работает нормально. Я могу понять, как компилятор думает, что лямбда возвращается по значению без подсказки (когда я изначально столкнулся с этой проблемой, лямбда напрямую возвращала результат из функции, которая вернула ссылку на константу, и в этом случае я бы подумал, что Константный возврат лямбда-выражения по ссылке можно было бы вывести, но, по-видимому, нет.) Что меня удивляет, так это то, что компилятор позволяет строить std :: function из лямбда с несоответствующими возвращаемыми типами. Ожидается ли такое поведение? Не хватает ли мне чего-то в стандарте, что допускает это несоответствие? Я вижу это с g ++ (GCC) 4.8.2, не пробовал ни с чем.
Спасибо!