7得票1回答
在`switch`语句中正确使用C++20的`[likely]`/`[[unlikely]]`关键字

C++20提供了方便的[[likely]]/[[unlikely]]属性来指导代码生成。例如,您可以通过以下方式指定分支很可能被执行: if (b) [[likely]] { /*...*/ } 同样,我们可以在 switch 语句中使用这些属性……但怎么使用呢?文档 给出了下面的示例(...

12得票3回答
C++20使用概念来限制'auto'非类型模板参数吗?

我有一个模板类,接受多个非类型参数(GPIO描述符)。使用auto关键字可以允许使用多种不同的GPIO实现。这些实现不能派生自一个共同的基类。 我能否使用概念来限制这些参数只能是具有正确接口的类型? 我已经定义了一个概念,但它不起作用,GCC告诉我“错误:'DigitalOutput'没有...

25得票3回答
declval<_Xp(&)()>()() - 在下面的上下文中,这句话是什么意思?

这个链接来自于: https://github.com/gcc-mirror/gcc/blob/master/libstdc++-v3/include/std/type_traits template&lt;typename _Xp, typename _Yp&gt; using...

7得票1回答
检测一个类型是来自基本模板的特化还是用户提供的特化。

假设我有这个: template&lt;typename T&gt; class my_template {...}; 现在,用户可以专门为自己的类型定制'my_template'。他们会将这些类型传递给我的一些API函数,这些函数将使用'my_template '的属性来完成一些操作。...

20得票1回答
为optional<T>实现operator<=>。

随着operator&lt;=&gt;被加入到C++20中,我想尝试思考如何实现这个运算符,对于那些不是简单的成员比较的情况。 如果要比较optional&lt;T&gt;和optional&lt;U&gt;或U,我们应该如何实现太空船运算符呢?这种情况下,我们要么比较T和U,要么比较底层状...

8得票1回答
使用consteval与constexpr函数相比的优势是什么?

我了解需求上的差异,我更感兴趣的是代码质量带来的好处。以下是我能想到的一些方面: 读者可以仅通过函数签名就知道函数在编译时被评估。 编译器可能会生成更少的代码,因为 consteval 函数在运行时从未使用(这是猜测,我没有实际的数据)。 无需使用变量来强制进行编译时函数执行(ctfe),...

7得票1回答
构建一个空对象

下面的代码示例似乎可以使用GCC 12.2编译,但与Clang 15和MSVC 19.33不同,由于错误illegal initializer type 'void'。我希望所有三个编译器都会拒绝该代码,因为构造(临时)void对象是没有意义的。 auto f() { return void...

16得票2回答
当定义自定义点对象时,为什么删除函数是必要的?

自libstdc++的&lt;concepts&gt;头文件: namespace ranges { namespace __cust_swap { template&lt;typename _Tp&gt; void swap(_Tp&amp;, _Tp&...

10得票1回答
在 consteval 上下文中,`inline` 和 `noexcept` 是否是多余的?

我正在处理一些代码,其中使用了constexpr函数,我目前正在重构这些函数,尽可能地将它们改为consteval。 inline constexpr auto example() noexcept { /*...*/ } 据我所知, 上面的inline关键字已经在constexpr函数...

52得票4回答
为什么在C++20中如果构造函数被显式默认或删除,聚合初始化不再起作用?

我正在将一个C++的Visual Studio项目从VS2017迁移到VS2019。现在我遇到了一个之前没有出现过的错误,可以通过以下代码几行来复现:struct Foo { Foo() = default; int bar; }; auto test = Foo { 0 };...