标签: c++20

什么是C++ 20中的协同程序?

什么是中的协同程序?

它与"Parallelism2"或/和"Concurrency2"的不同之处(见下图)?

以下图片来自ISOCPP.

https://isocpp.org/files/img/wg21-timeline-2017-03.png

在此输入图像描述

c++ coroutine c++20

84
推荐指数
2
解决办法
4万
查看次数

什么是尼布洛德?

使用 C++20,我们现在可以在 cppreference 中更频繁地阅读术语“niebloid”。

在 SO 上,我们今天可以找到 2020/07/16 2 篇提到它的文章:

谷歌也没有吐出那么多结果。最突出的也许是这里

有人可以更多地了解 niebloids 吗?

c++ c++20

75
推荐指数
1
解决办法
5914
查看次数

在 C++ 中限制“auto”是否违背了它的目的?

在 C++20 中,我们现在能够将auto关键字限制为仅属于特定类型。因此,如果我有一些如下所示的代码,没有任何限制:

auto something(){
  return 1;
}

int main(){
  const auto x = something();
  return x;
}
Run Code Online (Sandbox Code Playgroud)

这里的变量x被推导为一个int。然而,随着 C++20 的引入,我们现在可以将 约束auto为某种类型,如下所示:

std::integral auto something(){
  return 0;
}

int main(){
  const auto x = something();
  return x;
}
Run Code Online (Sandbox Code Playgroud)

这不是违背了来这里的目的吗auto?如果我真的需要一个std::integral数据类型,我不能完全省略吗auto?我是否完全误解了使用auto

c++ auto c++-concepts c++20

72
推荐指数
3
解决办法
7730
查看次数

为什么我不需要在 C++20 中的依赖类型之前指定“typename”?

这段代码在 C++20(使用 gcc 10.1)中编译,typename在依赖类型之前没有使用关键字std::vector<T>::iterator。为什么要编译?

#include <vector>

template<typename T>
std::vector<T>::iterator // Why does this not require "typename" before it?
f() { return {}; }

int main() {
    auto fptr = &f<int>;
}
Run Code Online (Sandbox Code Playgroud)

代码游乐场

c++ templates typename language-lawyer c++20

70
推荐指数
2
解决办法
3656
查看次数

为什么 std::bit_width 为值 0 返回 0,它不应该返回 1 吗?

std::bit_width发现代表整数所需的最小比特x作为1+floor(log(x))

为什么std::bit_width值 0 返回 0?它不应该返回 1,因为表示 0 所需的位数是 1?

另外,我认为1公式中的 是一个偏移量。

c++ c++20

64
推荐指数
3
解决办法
3683
查看次数

什么是 C++20 中的“销毁运算符删除”?

C ++ 20 引入了“销毁operator delete”:operator delete采用标记类型std::destroying_delete_t参数的新重载。

这到底是什么,什么时候有用?

c++ destructor destroy delete-operator c++20

57
推荐指数
1
解决办法
3835
查看次数

无栈C ++ 20协程是否有问题?

基于以下内容,C ++ 20中的协程看起来像是无堆栈的。

https://en.cppreference.com/w/cpp/language/coroutines

我担心的原因有很多:

  1. 在嵌入式系统上,堆分配通常是不可接受的。
  2. 在低级代码中,co_await的嵌套很有用(我不相信无栈协程允许这样做)。

使用无堆栈协程时,只有顶层例程可以被挂起。该顶级例程调用的任何例程本身都不会暂停。这禁止在通用库中的例程中提供挂起/恢复操作。

https://www.boost.org/doc/libs/1_57_0/libs/coroutine/doc/html/coroutine/intro.html#coroutine.intro.stackfulness

  1. 由于需要自定义分配器和内存池,因此代码更加详细。

  2. 如果任务等待操作系统为它分配一些内存(没有内存池),则速度较慢。

鉴于这些原因,我真的希望我对当前的协程是错误的。

问题分为三个部分:

  1. 为什么C ++选择使用无堆栈协程?
  2. 关于在无堆栈协程中保存状态的分配。我可以使用alloca()避免通常用于协程创建的任何堆分配。

协程状态是通过非数组运算符new在堆上分配的。 https://en.cppreference.com/w/cpp/language/coroutines

  1. 我对C ++协程的假设是错误的,为什么?

编辑:

我现在正在为协程进行cppcon讨论,如果我对自己的问题有任何答案,我将其发布(到目前为止没有任何内容)。

CppCon 2014:Gor Nishanov“等待2.0:无堆栈可恢复函数”

https://www.youtube.com/watch?v=KUhSjfSbINE

CppCon 2016:James McNellis“ C ++协程简介”

https://www.youtube.com/watch?v=ZTqHjjm86Bw

c++ asynchronous c++20 c++-coroutine

56
推荐指数
3
解决办法
5069
查看次数

约束函数会允许模板参数取决于函数参数吗?

在C ++ 17中,此代码是非法的:

constexpr int foo(int i) {
    return std::integral_constant<int, i>::value;
}
Run Code Online (Sandbox Code Playgroud)

这是因为即使foo可以在编译时进行评估,编译器仍然需要产生指令以在运行时执行它,从而使模板实例化成为不可能。

在C ++ 20中,我们将具有consteval需要在编译时评估的函数,因此应删除运行时约束。这是否意味着该代码将是合法的?

consteval int foo(int i) {
    return std::integral_constant<int, i>::value;
}
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer class-template constexpr c++20

55
推荐指数
3
解决办法
1521
查看次数

我应该如何编写C++来为C++模块做好准备?

已经有两个支持C++模块的编译器:

现在开始一个新项目时,为了能够在我的编译器最终发布时采用模块功能,我应该注意什么?

是否可以使用模块并仍然保持与不支持它的旧编译器的兼容性?

c++ backwards-compatibility future-proof c++20 c++-modules

54
推荐指数
2
解决办法
2万
查看次数

删除了 C++20 标准库中的 operator!=

根据cppreferenceoperator!=许多标准库类型的 ,包括std::unordered_map::operator!=和在 C++20 中std::unordered_set::operator!=删除

委员会做出该决定的理由是什么?这不会使比较支持不对称吗?

c++ deprecated c++-standard-library comparison-operators c++20

53
推荐指数
0
解决办法
5011
查看次数