Hãy xem xét đoạn mã sau:Loại trả về của biểu thức lambda nếu một mục của vectơ được trả về là gì?
#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;
}
Tôi đã chờ đợi kết quả tương tự: trong f
, v
được truyền bằng tham chiếu const, do đó v[i]
nên có const int&
loại.
Tuy nhiên, tôi nhận được kết quả
0 3
Nếu tôi không sử dụng std :: chức năng, mọi thứ đều tốt:
#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;
}
đầu ra:
3 3
Vì vậy tôi m tự hỏi:
Trong đoạn thứ hai, loại trả về của biểu thức lambda
f
là gì? Có phải làf
giống nhưg
?Trong đoạn đầu tiên, điều gì đã xảy ra khi
std::function f
được tạo, gây ra lỗi?
Trình biên dịch nào? – 0x499602D2
@ 0x499602D2 sử dụng ideone, C++ 14. http://ideone.com/gkAorj –
Rất kỳ quặc, nó cung cấp cho [lỗi phân đoạn] (http://melpon.org/wandbox/permlink/Vnf1dCbOqHmMlBAQ) trong phiên bản gcc mới nhất. – 0x499602D2