我正在尝试构造一个返回const int
的lambda,但是const
限定符已被丢弃。在下面的代码中,lam1
和lam3
的行为符合预期,但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;
}
答案 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
有关,那么您可能已经观察到其他情况(请参见上一个链接)。 :)