xml*_*lmx 5 c++ lambda decltype type-deduction c++17
#include <type_traits>
int x = 0;
void f(int const x)
{
static_assert(std::is_const_v<decltype(x)>); // ok
}
int main()
{
int n = 0;
[n, m = n]
{
static_assert(std::is_const_v<decltype(m)>); // ok
static_assert(std::is_const_v<decltype(n)>); // err
};
}
Run Code Online (Sandbox Code Playgroud)
看在线演示
为什么行为 decltype(captured_var) 不符合预期?
需要注意的是在decltype(n),n指的是局部变量n的定义main(),而不是封闭类型的成员(如你预期)。
(强调我的)
一个 lambda 表达式的复合语句中的每个 id 表达式是对复制捕获的实体的 odr 使用,被转换为对闭包类型的相应未命名数据成员的访问。
[注 7:不是 odr-use 的 id 表达式指的是原始实体,而不是闭包类型的成员。但是,这样的 id 表达式仍然会导致实体的隐式捕获。— 尾注]
顺便说一句:Gcc 似乎const直接将数据成员声明为非可变 lambda。这就是为什么它给出const intfor decltype(m)。根据标准,[expr.prim.lambda.capture]/10.2
(强调我的)
如果实体是对对象的引用,则此类数据成员的类型是被引用类型,如果实体是对函数的引用,则是对被引用函数类型的左值引用,否则是对应的捕获实体的类型。
我认为 gcc 是错误的;decltype(m)应该导致类型int. 无论如何,decltype(n)确实引用了局部变量n,您可以通过例如将n的类型更改为 来确认这一点int&&。
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |