无法通过lambda

时间:2019-06-18 20:31:56

标签: c++

我正在尝试构造一个返回const int的lambda,但是const限定符已被丢弃。在下面的代码中,lam1lam3的行为符合预期,但lam2的行为却不正常。预期的输出为0 1 1,但我得到的是0 0 1

#include<type_traits>
#include<iostream>
using namespace std;

int main()
{
  int C{0};
  auto lam1 = [&]()->       int& {return C;};
  auto lam2 = [&]()-> const int  {return C;};
  auto lam3 = [&]()-> const int& {return C;};

  cout << is_const<remove_reference<decltype(lam1())>::type>::value << endl;
  cout << is_const<remove_reference<decltype(lam2())>::type>::value << endl;
  cout << is_const<remove_reference<decltype(lam3())>::type>::value << endl;
}

演示链接:https://godbolt.org/z/xP4lYs

2 个答案:

答案 0 :(得分:3)

是故意的。请记住,decltype返回表达式的类型,可能带有引用限定符以匹配表达式的值类别。 lam2返回一个prvalue,然后...

  

[expr]

     

6如果prvalue最初的类型为“ cv T”,则T为   cv-unqualified非类,非数组类型,表达式的类型   在进行任何进一步分析之前先将其调整为T。

没有原始类型的const prvalue。由于返回的是const int,这就是函数调用表达式的类型,因此在进行进一步分析(包括decltype推断出表达式的类型)之前,将删除const。

对于类类型,情况并非如此,因为cv限定词会影响类对象的行为。

答案 1 :(得分:0)

回想一下it works this way for normal functions too

这是设计使然,因为returning built-ins by const value is pointless

但是,decltype会“删除”它(或者让您观察到它在表达式中使用时已被删除)– const 仍然是函数签名的一部分。如果您的示例与类类型有关,而不与int有关,那么您可能已经观察到其他情况(请参见上一个链接)。 :)