2017-09-26 101 views
4

我有一些麻烦从lambda返回引用。 此代码的工作:C++ 11 lambda返回引用

std::function<int*(int*)> funct; 

funct = [](int *i){ 
    ++*i; 
    return i; 
}; 

int j = 0; 
LOG<<*funct(&j)<<j; 

输出:1

但不是这一个:

std::function<int&(int&)> funct; 

funct = [](int &i){ 
    ++i; 
    return i; 
}; 

int j = 0; 
LOG<<funct(j)<<j; 

大楼错误:C:\ Program Files文件(x86)的\微软的Visual Studio 14.0 \ VC \ include \ type_traits:1441:error:C2440:'return':无法从'int'转换为'int &'

任何想法为什么?对我而言,这是一回事。

+0

请提供[MCVE]。你目前的一个不能编译。 – tambre

+0

你为什么要把它作为参考返回?应该解决什么问题?为什么不简单地按值返回(这是lambda已经做的)? –

+0

@Someprogrammerdude因为它通过参数获取它作为参考。例如链式'std :: ostream :: operator <<'调用。 – Slava

回答

18

该lambda推导返回类型,就像指定auto一样。 auto ret = i;将推断retint

一种解决方案是明确的陈述拉姆达的返回类型:

funct = [](int &i) -> int& { 
    ++i; 
    return i; 
}; 

正如意见中提到的另一种方式是

funct = [](int &i) -> decltype(auto) { 
    ++i; 
    return i; 
}; 

它实际上告诉编译器不要做任何扣除和只需使用该类型就好像decltype已用于返回表达式。

如果您对确切规则检查感到好奇the documentation其中还有auto部分和decltype(auto)位。

+0

或者使用'decltype(auto)'作为返回类型!这与'auto'的使用形成鲜明对比。也就是说,'decltype(auto)ret = i;'使'ret'作为对'i'的引用。 – Nawaz

+0

和人们说C++具有模糊,复杂的语法。他们知道什么:-) – pm100