标签: c++20


什么是"跨度",什么时候应该使用?

最近我有建议span<T>在我的代码中使用's,或者在网站上看到了一些使用span's - 应该是某种容器的答案.但是 - 我在C++标准库中找不到类似的东西.

那么这个神秘的是什么span<T>,以及为什么(或什么时候)使用它是一个好主意,如果它是非标准的?

c++ c++-faq cpp-core-guidelines c++20 std-span

202
推荐指数
3
解决办法
4万
查看次数

什么是C++中的<=>运算符?

当我试图了解C++运算符时,我偶然发现cppreference.com上的一个奇怪的比较运算符,*在一个如下所示的表中:

在此输入图像描述

"好吧,如果这些是C++中常见的操作符,我会更好地学习它们",我想.但我所有试图阐明这个谜团的尝试都没有成功.即使在这里,在Stack Overflow上我的搜索也没有运气.

<=>C++之间是否存在联系?

如果有的话,这个运营商到底做了什么?

*与此同时,cppreference.com更新了该页面,现在包含有关<=>运营商的信息.

c++ operators c++-faq spaceship-operator c++20

200
推荐指数
5
解决办法
3万
查看次数

为什么我们要求要求?

C++ 20概念的一个角落是,在某些情况下你必须编写requires requires.例如,[expr.prim.req]/3中的这个例子:

需要表达也可以在使用需要子句([温度])作为写在模板参数特设约束,如下面的一个的一种方法:

template<typename T>
  requires requires (T x) { x + x; }
    T add(T a, T b) { return a + b; }
Run Code Online (Sandbox Code Playgroud)

第一个需要引入requires子句,第二个需要引入requires-expression.

需要第二个requires关键字的技术原因是什么?为什么我们不能只允许写作:

template<typename T>
  requires (T x) { x + x; }
    T add(T a, T b) { return a + b; }
Run Code Online (Sandbox Code Playgroud)

(注意:请不要回答那个语法requires吧)

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

155
推荐指数
4
解决办法
1万
查看次数

C++20 行为用相等运算符破坏现有代码?

我在调试这个问题时遇到了这个问题

我一直将其精简为仅使用Boost Operators

  1. 编译器资源管理器C++17 C++20

    #include <boost/operators.hpp>
    
    struct F : boost::totally_ordered1<F, boost::totally_ordered2<F, int>> {
        /*implicit*/ F(int t_) : t(t_) {}
        bool operator==(F const& o) const { return t == o.t; }
        bool operator< (F const& o) const { return t <  o.t; }
      private: int t;
    };
    
    int main() {
        #pragma GCC diagnostic ignored "-Wunused"
        F { 42 } == F{ 42 }; // OKAY
        42 == F{42};         // C++17 OK, C++20 infinite …
    Run Code Online (Sandbox Code Playgroud)

c++ spaceship-operator c++17 c++20

107
推荐指数
1
解决办法
4526
查看次数

C ++ 20是否要求将源代码存储在文件中?

但是,一个有点奇怪的问题是,如果我没有记错的话,C ++源代码不需要文件系统来存储其文件。

拥有一个可以通过照相机扫描手写纸的编译器将是一个符合要求的实现。尽管实际上没有太大意义。

但是,C ++ 20现在使用添加了源位置file_name。现在,这是否意味着源代码应始终存储在文件中?

c++ language-lawyer c++20 std-source-location

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

chrono::month 和 chrono::months 有什么区别

C++20 计时类型/值month{7}months{7}? 有两个如此相似的名字是不是很混乱?

c++ c++-chrono c++20

103
推荐指数
1
解决办法
4951
查看次数

在 C++20 之前将 malloc 用于 int 未定义行为

有人告诉我,以下代码在 C++20 之前具有未定义的行为:

int *p = (int*)malloc(sizeof(int));
*p = 10;
Run Code Online (Sandbox Code Playgroud)

真的吗?

论点是int对象的生命周期在为其分配值之前没有开始(P0593R6)。要解决此问题,new应使用放置:

int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;
Run Code Online (Sandbox Code Playgroud)

我们真的必须调用一个微不足道的默认构造函数来启动对象的生命周期吗?

同时,代码在纯 C 中没有未定义的行为。但是,如果我int在 C 代码中分配 an并在 C++ 代码中使用它呢?

// C source code:
int *alloc_int(void)
{
    int *p = (int*)malloc(sizeof(int));
    *p = 10;
    return p;
}

// C++ source code:
extern "C" int *alloc_int(void);

auto p = alloc_int();
*p = 20;
Run Code Online (Sandbox Code Playgroud)

它仍然是未定义的行为吗?

c++ malloc undefined-behavior c++20

97
推荐指数
2
解决办法
5952
查看次数

为什么C ++ 20中引入了std :: ssize()?

C ++ 20引入了std::ssize()free函数,如下所示:

template <class C>
    constexpr auto ssize(const C& c)
        -> std::common_type_t<std::ptrdiff_t,
                              std::make_signed_t<decltype(c.size())>>;
Run Code Online (Sandbox Code Playgroud)

似乎可以使用实现static_cast,将size()cl ass C的成员函数的返回值转换为其已签名的对应函数。

由于size()C 的成员函数始终返回非负值,为什么有人会将它们存储在带符号的变量中?万一真的要,那很简单static_cast

为什么std::ssize()在C ++ 20中引入?

c++ c++20

92
推荐指数
2
解决办法
6823
查看次数

当C++ 14已经具有泛型lambda时,在C++ 20中引入模板lambda的需求是什么?

引入了通用lambdas,可以编写以下内容:

auto func = [](auto a, auto b){
    return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
Run Code Online (Sandbox Code Playgroud)

很明显,这个通用lambda func就像模板化函数func一样有效.

为什么C++委员会决定为通用lamda添加模板语法?

c++ generic-lambda c++14 c++20

90
推荐指数
4
解决办法
6641
查看次数