Questions tagged «c++20»

C ++ 20是C ++ 17之后的C ++版本的目标。对于与C ++ 20有关的C ++功能,应使用此标签(与C ++标签一起使用)。

1
是否允许require表达式“捕获”封闭范围的变量?
在下面的示例中,函数自变量用于测试require表达式是否可以正确使用它们。require表达式不带参数。它直接使用函数作用域中的变量: #include <cstddef> #include <vector> template<typename T> void Resize(T &v, std::size_t const n) { if constexpr (requires { v.resize(n); }) v.resize(n); } template<typename T> void Eziser(T &v, std::size_t const n) { if constexpr (requires { v.eziser(n); }) v.eziser(n); } int main() { std::vector<int> v; Resize(v, 10u); Eziser(v, 10u); } 上面的代码使用Clang概念分支进行编译。但是,GCC10仅接受对的呼叫Resize。GCC9 …

1
UB是否可以恢复其生存期已结束的对象的成员函数协程?
这个问题源于以下评论:C ++ 20协程的Lambda生命周期说明 关于这个例子: auto foo() -> folly::coro::Task<int> { auto task = []() -> folly::coro::Task<int> { co_return 1; }(); return task; } 所以问题是执行返回的协程是否foo会导致UB。 “调用”成员函数(在对象的生存期结束之后)是UB:http : //eel.is/c++draft/basic.life#6.2 ...可以使用任何表示对象将要或曾经位于的存储位置的地址的指针,但只能以有限的方式使用。[...]该程序在以下情况下具有未定义的行为: [...] -指针用于访问对象的非静态数据成员或调用该对象的非静态成员函数,或者 但是,在此示例中: ()Lambda的生存期仍然有效时,将调用Lambda 的运算符 然后将其挂起, 然后lambda被破坏, 然后成员函数(operator ())随后恢复。 是否将此恢复视为未定义的行为?

1
未指定的隐式对象创建
自从接受了P0593用于低级对象操作的对象隐式创建以来,现在可以在C ++ 20中隐式创建对象。 提案中特别引入的措辞允许某些操作(例如std::malloc)自动创建和启动某些类型的对象(称为隐式生命周期类型)的生存期,如果引入此类对象会导致具有其他未定义行为的程序具​​有定义的行为。参见[intro.object] / 10。 草案现在进一步指出,如果可以隐式创建多个这样的对象集以赋予程序定义的行为,则未指定创建这些对象集中的哪个。(有关的句子似乎没有出现在我可以访问的上一个提案修订版R5中,而是在提交草案中。) 实际上是否有一个程序可以针对这种隐式创建的对象集进行选择?换句话说,是否有一个程序通过此新规则具有已定义但未指定的行为,从而可以从输出中推断出创建了哪些隐式对象类型集(超过一个可能的类型)? 还是这句话只是为了阐明程序在抽象机上的执行(没有明显的影响)?

1
如何在C ++ 20中实现shift_right()?
在C ++ 20中,<algorithm>标头获得了两个新算法:shift_left()和shift_right()。他们两个都接受任何LegacyForwardIterator。对于shift_left(),指定了``移动i从​0'' 开始以递增顺序执行; 对于shift_right(),指定为“如果ForwardIt满足LegacyBidirectionalIterator要求,则以i从开始的降序执行移动last - first - n - 1。” 我可以想到一种相当容易实现的方法shift_left(): template <typename ForwardIt> constexpr inline ForwardIt shift_left(ForwardIt first, ForwardIt last, typename std::iterator_traits<ForwardIt>::difference_type n) { if (n <= 0) return last; ForwardIt it = first; for (; n > 0; --n, ++it) { if (it == last) return first; …

4
隐藏空的基类以进行聚合初始化
考虑以下代码: struct A { // No data members //... }; template<typename T, size_t N> struct B : A { T data[N]; } 这是初始化B的方式:B<int, 3> b = { {}, {1, 2, 3} }; 我想避免基类不必要的空{}。Jarod42 在此处提出了一个解决方案,但是,它不适用于元素默认初始化:B<int, 3> b = {1, 2, 3};很好,但B<int, 3> b = {1};不是:b.data[1]并且b.data[2]没有默认初始化为0,并且发生了编译器错误。有什么办法(或c ++ 20会有)从构造中“隐藏”基类?

1
-fno-char8_t的MSVC等效项是什么?
在C ++ 20中,u8字符串文字是基于char8_t类型的。它们故意不再转换为char const*: const char* str = u8"Hall\u00f6chen \u2603"; // no longer valid in C++20 当然,迁移到C ++ 20时的最终目标是完全采用新行为(在上面的示例中:更改的类型str)。但是,由于有第三方库,因此通常无法立即实现。 引入和“补救” 的建议char8_t预期并提到在clang和gcc中有一个-fno-char8_t标志可以切换回旧的行为(同时仍然可以享受其他C ++ 20功能)。 第二个建议设置了微软将遵循并添加类似标志的期望,但是我无法找到如何设置它(至少在VS 2019版本16.4中)。 那么有人知道MSVC的含义-fno-char8_t是什么吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.