簡體   English   中英

C ++ 11 lambda返回引用

[英]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; 會推斷retint

一種解決方案是顯式聲明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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM