c++20相关内容
此问题在此处的评论中进行了讨论. 在Eric Niebler的 ranges-v3库中(某种程度上已成为C ++ 20的标准),ranges::ostream_iterator是默认可构造-没有ostream. 为什么? 我认为后来具有有效构造的“虚拟"构造是C ++中的反模式,我们逐渐摆脱了这种疣. std::ostream iterator 只能与流一起构建(目前-之前C +
..
#include #include #include int main() { auto coll = std::vector{ 1, 2, 3 }; ranges::copy( coll, ranges::ostream_iterator{ std::co
..
从 cppreference.com 引用: 添加模板专业化 仅当声明依赖于至少一个程序定义的类型并且该专业满足原始模板的所有要求,除非禁止此类专业. 这是否意味着,从C ++ 20开始,将不再允许将功能模板的特殊化添加到用户定义类型的std名称空间中?如果是这样,则意味着许多现有代码可能会中断,不是吗? (在我看来,这是一种“激进的"改变.)此外,它将在代码中注入未定义的行为,
..
C ++ 20功能std::source_location用于捕获有关调用函数的上下文的信息. 当我尝试将其与可变参数模板函数一起使用时,遇到一个问题:我看不到放置source_location参数的地方. 以下操作无效,因为可变参数必须在末尾: // doesn't work template void debug(Args&&... args,
..
最近我得到了在代码中使用 span 的建议,或者在网站上看到了使用 span -应该是某种容器。但是-我在C ++ 17标准库中找不到类似的东西。 那么这个神秘的 span 是什么,以及为什么(或何时) 解决方案 是什么? A span 是: a的非常轻量级的抽象内存中某个位置的 T 类型的连续值序列。 基本上是结构{T * ptr; std :
..
Herb Sutter,在他的“太空飞船"提案中“运算符(第12页底部的2.2.2节)说: 基于的所有内容及其返回类型:此模型具有主要优势,与以前的C ++提议和其他语言的功能相比,该提议具有一些独特之处: [...] (6)效率,包括最终实现零开销抽象以进行比较:绝大多数比较始终是单次通过.对于同时支持部分排序和相等性的类型,唯一的例外是生成=.对于
..
当我尝试学习 C ++ 运算符时,我偶然发现了 cppreference.com , * : “好吧,如果它们是C ++中的常用运算符,我最好学习它们".但是我为阐明这个奥秘所做的所有尝试都没有成功.即使在这里,在Stack Overflow上我的搜索也没有运气. 和 C ++ 之间是否存在联系? 如果有的话,这个运算符的作用是什么? *在此期间cpprefere
..
C ++ 20引入了 std::common_reference .目的是什么?有人可以举一个使用它的例子吗? 解决方案 common_reference是出于我的努力,提出了可容纳代理迭代器的STL迭代器的概念. 在STL中,迭代器具有两种相关的特殊类型:reference和value_type.前者是迭代器operator*的返回类型,而value_type是序列元素的(非常量,
..
假设我已经定义了zero_initialize()函数: template T zero_initialize() { T result; std::memset(&result, 0, sizeof(result)); return result; } // usage: auto data = zero_initialize();
..
很简单,是否有一种更简单的方法可以将某个块重复一定次数,而其中的块不需要计数器变量?平凡的解决方案当然是 for (int i = 0; i
..
在当前的C ++标准草案中,左移运算符的定义如下 [ expr.shift] : E1
..
请考虑以下示例(代码段(0)): struct X { constexpr int get() const { return 0; } }; void foo(const X& x) { constexpr int i = x.get(); } int main() { foo(X{}); } 上面的示例使用g++ 10.x之前的所有g++版本进行编译,并且从
..
这可能是一个愚蠢的问题,但是我很困惑.我感觉在编译期间必须执行即时(consteval)函数 ,而我们根本无法在二进制文件中看到其主体. 这篇文章明显支持我的感觉: 这意味着[immediate]函数仅在编译时可见.该函数不会发出符号,您不能使用该函数的地址,并且调试器之类的工具将无法显示它们.在这种情况下,立即函数类似于宏. 在赫伯·萨特(Herb Sutter)的出版物:
..
此问题是在这是我的例子: #include #include void foo(void *p) { if ( std::getchar() == 'i' ) { *(int *)p = 2; std::printf("%d\n", *(int *)p); } else {
..
[temp.concept]/5 说: 未实例化概念([temp.spec]). [注:表示概念专业化的id表达式被评估为表达式([expr.prim.id]). [...]] 是否表示此规则如下( [ temp.point]/8 )不适用? 如果两个不同的实例化点根据一个定义规则赋予模板专业化不同的含义,则程序格式错误,无需诊断. 例如,如果该规则不适用,则以下代码格式正
..
以下程序在C ++ 17和更高版本中是否具有未定义的行为? struct A { void f(int) { /* Assume there is no access to *this here */ } }; int main() { auto a = new A; a->f((a->~A(), 0)); } C ++ 17保证在对调用的参数求值之前,对A对象
..
这是对我的上一个问题我似乎使问题比我最初打算的要复杂得多. (请参阅有问题的讨论并在此处回答评论.) 该问题是对原始问题的略微修改,消除了在构建/破坏封闭对象期间的特殊规则问题. 是否允许在其封闭对象的生存期内重用非静态数据成员的存储,如果是,则在什么条件下? 考虑程序 #include #include using T = /*some t
..
我最近阅读了C ++ 17中的[[nodiscard]],据我了解,它是一项新功能(按合同设计?),它迫使您使用返回值.对于像std::launder这样的有争议的函数(自C ++ 20起不丢弃),这是有道理的,但是我不知道为什么std::move的定义没有像C ++ 17/20中那样.您知道很好的理由还是因为C ++ 20尚未完成? 解决方案 AFAIK 我们建议采取保守的方法:
..
我正在寻找一种方法,该方法可在每次实例化模板时自动使默认模板参数唯一.由于由lambda表达式创建的未命名函数对象具有不同的类型,因此我想到以某种方式采用它们.随着标准daft的最新更改,删除了"lambda表达式不应出现在...模板参数中" 限制(请参见#include template class unique
..
根据ISO C ++委员会的上次会议,由于类型别名,我知道reinterpret_cast不适合该工作规则,但是我的问题是为什么他们为什么不选择不扩展reinterpret_cast来将对象像位序列表示一样对待,而是倾向于将此功能作为一种新的语言构造来提供? 解决方案 好吧,有一个明显的原因:因为它无法完成bit_cast的所有工作.即使在我们可以在编译时分配内存的C ++ 20世界中,c
..