一个例子通常比长期解释更好.
您可以在Coliru上编译并运行此代码段.
(另一个前例子也可用)
#include <map>
#include <iostream>
struct MyClass
{
enum class …Run Code Online (Sandbox Code Playgroud) 最近我有建议span<T>在我的代码中使用's,或者在网站上看到了一些使用span's - 应该是某种容器的答案.但是 - 我在C++标准库中找不到类似的东西.
那么这个神秘的是什么span<T>,以及为什么(或什么时候)使用它是一个好主意,如果它是非标准的?
当我试图了解C++运算符时,我偶然发现cppreference.com上的一个奇怪的比较运算符,*在一个如下所示的表中:

"好吧,如果这些是C++中常见的操作符,我会更好地学习它们",我想.但我所有试图阐明这个谜团的尝试都没有成功.即使在这里,在Stack Overflow上我的搜索也没有运气.
如果有的话,这个运营商到底做了什么?
*与此同时,cppreference.com更新了该页面,现在包含有关<=>运营商的信息.
C++ 20概念的一个角落是,在某些情况下你必须编写requires requires.例如,[expr.prim.req]/3中的这个例子:
甲需要表达也可以在使用需要子句([温度])作为写在模板参数特设约束,如下面的一个的一种方法:
Run Code Online (Sandbox Code Playgroud)template<typename T> requires requires (T x) { x + x; } T add(T a, T b) { return a + b; }第一个需要引入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吧)
我一直将其精简为仅使用Boost Operators:
#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 ++源代码不需要文件系统来存储其文件。
拥有一个可以通过照相机扫描手写纸的编译器将是一个符合要求的实现。尽管实际上没有太大意义。
但是,C ++ 20现在使用添加了源位置file_name。现在,这是否意味着源代码应始终存储在文件中?
C++20 计时类型/值month{7}和months{7}? 有两个如此相似的名字是不是很混乱?
有人告诉我,以下代码在 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 ++ 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 ++ 14引入了通用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添加模板语法?