可以在 C++20 中的 `decltype` 或 `sizeof` 表达式中定义类型吗?

费多

由于 C++20 lambda 函数在未计算的上下文中是允许的,特别是它们应该被允许在decltypesizeof表达式中。

反过来,lambda 可以在它们的主体中定义一些类型以及这些类型的可能返回对象,例如:

using T = decltype( []{ struct S{}; return S{}; } );

[[maybe_unused]] constexpr auto N 
          = sizeof( []{ struct S{}; return S{}; } );

Clang 接受此代码,但 GCC 发出错误:

error: types may not be defined in 'decltype' expressions
    1 | using T = decltype( []{ struct S{}; return S{}; } );
error: types may not be defined in 'sizeof' expressions
    4 |           = sizeof( []{ struct S{}; return S{}; } );

演示:https : //gcc.godbolt.org/z/9aY1KWfbq

哪一个编译器就在这里?

弗里布

P0315R4 起删除的未评估上下文中对 lambda 的限制意味着这不被禁止(尽管是极端情况),因此可以说 GCC 在这里有一个错误。特别是论文中的以下讨论与此处相关:

此外,在核心反射器上提出了一些关于重新声明的问题,如下所示:

template <int N> static void k(decltype([]{ return 0; }()));
template <int N> static void k(decltype([]{ return 0; }())); // okay
template <int N> static void k(int); // okay

这些应该是有效的重新声明,因为 lambda 表达式被评估,并且它们的主体中既不包含模板参数,也不是包含模板参数的完整表达式的一部分。因此,lambda 表达式不需要出现在函数的签名中,其行为与此等效,无需任何特殊措辞:

struct lambda { auto operator()() const { return 0; } };
template <int N> static void k(decltype(lambda{}()));
template <int N> static void k(decltype(lambda{}())); // okay today
template <int N> static void k(int); // okay today

同样的论点也适用于 OP 的示例,并且(可以说)“行为与此等效,无需任何特殊措辞”

struct lambda { auto operator()() const { struct S{}; return S{}; } };
using T = decltype(lambda{});

[[maybe_unused]] constexpr auto N 
          = sizeof( []{ struct S{}; return S{}; } );

请注意,sizeof更简单,因为您正在查询无捕获 lambda 的闭包类型的大小,而不是本地 struct 的大小S

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

sizeof(变量名称或表达式)是否与sizeof(decltype(变量名称或表达式))相同?

sizeof(变量名称或表达式)是否与sizeof(decltype(变量名称或表达式))相同?

c ++ 17中的非类型模板参数可以是decltype(auto)吗?

C ++ 20概念:GCC和Clang中带有指针类型成员的复合需求表达式的行为差异

我可以在C ++中扩展条件表达式吗

sizeof vs sizeof()在标准C中?

在C ++中,不评估对应用sizeof的表达式是否合法,以取消引用sizeof中的空指针或无效指针是合法的?

C中sizeof的内部机制

为什么必须在符号名称中修饰返回类型中的decltype表达式?

C ++从decltype返回类型中删除noexcept

C ++中的sizeof('ab')是否等于sizeof(int)?

模板函数中可以删除构造函数的decltype

派生类中的sizeof(* this)和decltype(* this)

sizeof(),在C结构中对齐:

我可以从C ++ 17折叠表达式中解析出各个函数吗

可以指定C ++ 20模板化的lambda来推断嵌套在参数中的类型吗?

是否可以包装仅在C#中的表达式中使用的类型?

如果定义了函数,Sympy可以识别表达式中的函数吗?

在C ++ 20中可以混合使用模块和标题吗?

为什么在C ++ 11中需要decltype?

C ++中的decltype(this)是什么类型?

在C ++ 98中实现decltype

C ++中的decltype()导致编译错误

模板内部类中的 C++ decltype

C++中sizeof的行为

结构 C 中的 sizeof 数组

C 编程中的 sizeof() 行为

在 C 中,表达式可以是指针吗?

可以在 C++20 中的类定义之外默认比较运算符吗?