Рассмотрим следующий фрагмент:
#include <iostream>
#include <vector>
#include <functional>
int main()
{
std::vector<int>v = {0,1,2,3,4,5,6};
std::function<const int&(int)> f = [&v](int i) { return v[i];};
std::function<const int&(int)> g = [&v](int i) -> const int& { return v[i];};
std::cout << f(3) << ' ' << g(3) << std::endl;
return 0;
}
Я ожидал тот же результат: в f
, v
передается константной ссылкой, поэтому v[i]
должен иметь тип const int&
.
Однако я получаю результат
0 3
Если я не использую std:: function, все в порядке:
#include <iostream>
#include <vector>
#include <functional>
int main()
{
std::vector<int>v = {0,1,2,3,4,5,6};
auto f = [&v](int i) { return v[i];};
auto g = [&v](int i) -> const int& { return v[i];};
std::cout << f(3) << ' ' << g(3) << std::endl;
return 0;
}
выход:
3 3
Таким образом, мне интересно:
-
Во втором фрагменте, каков тип возвращаемого выражения лямбда
f
? Является лиf
тем же, что иg
? -
В первом фрагменте, что произошло при построении
std::function f
, вызвавшем ошибку?