[英]C++11 lambda returning reference
從lambda返回引用我有些麻煩。 此代碼有效:
std::function<int*(int*)> funct;
funct = [](int *i){
++*i;
return i;
};
int j = 0;
LOG<<*funct(&j)<<j;
輸出:1 1
但不是這個:
std::function<int&(int&)> funct;
funct = [](int &i){
++i;
return i;
};
int j = 0;
LOG<<funct(j)<<j;
構建錯誤:C:\\ Program Files(x86)\\ Microsoft Visual Studio 14.0 \\ VC \\ include \\ type_traits:1441:錯誤:C2440:'return':無法從'int'轉換為'int&'
知道為什么嗎? 對我來說,這是一回事。
lambda推導出返回類型,就像使用auto
指定一樣。 auto ret = i;
會推斷ret
為int
。
一種解決方案是顯式聲明lambda的返回類型:
funct = [](int &i) -> int& {
++i;
return i;
};
正如評論中提到的另一種方式
funct = [](int &i) -> decltype(auto) {
++i;
return i;
};
這基本上告訴編譯器不要做任何推論,只是使用類型,就像在返回表達式上使用了decltype
一樣。
如果您對確切的規則感到好奇,請查看文檔 ,其中還有一個關於auto
的部分和一些關於decltype(auto)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.