gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:03:46 24 4
gpt4 key购买 nike

由于 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 在这里有一个错误。特别是论文中的以下讨论与此相关:

Furthermore, some questions were raised on the Core reflectorregarding redeclarations like this:

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

These should be valid redeclarations, since the lambda expressions areevaluated, and they neither contain a template parameter in their bodynor are part of a full-expression that contains one. Hence, thelambda-expression does not need to appear in the signature of thefunction, and the behavior is equivalent to this, without requiringany special wording:

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 闭包类型的大小,而不是本地结构 S 的大小。

关于c++ - 可以在 C++20 的 `decltype` 或 `sizeof` 表达式中定义类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69204086/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com