Questions tagged «c++20»

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

2
内联在模块接口中的含义
考虑头文件: class T { private: int const ID; public: explicit T(int const ID_) noexcept : ID(ID_) {} int GetID() const noexcept { return ID; } }; 或者,或者: class T { private: int const ID; public: explicit T(int const ID_) noexcept; int GetID() const noexcept; }; inline T::T(int const ID_) noexcept …

3
显式(布尔)的用例是什么
C ++ 20引入了显式(布尔),它在编译时有条件地选择是否使构造函数显式。 下面是我在这里找到的示例。 struct foo { // Specify non-integral types (strings, floats, etc.) require explicit construction. template <typename T> explicit(!std::is_integral_v<T>) foo(T) {} }; foo a = 123; // OK foo b = "123"; // ERROR: explicit constructor is not a candidate (explicit specifier evaluates to true) foo c {"123"}; …
24 c++  c++20  explicit 

3
C ++ 20概念:当template参数符合多个概念时,选择哪种模板专业化?
鉴于: #include <concepts> #include <iostream> template<class T> struct wrapper; template<std::signed_integral T> struct wrapper<T> { wrapper() = default; void print() { std::cout << "signed_integral" << std::endl; } }; template<std::integral T> struct wrapper<T> { wrapper() = default; void print() { std::cout << "integral" << std::endl; } }; int main() { wrapper<int> w; …

1
'auto'作为函数参数的模板参数占位符
C ++ 20允许使用auto函数参数类型。 它是否还允许将函数参数类型auto用作模板参数占位符(不相似,但以C ++ 17 template <auto>的精神)。 因此,以下代码是C ++ 20之前的版本: template<typename First, typename Second> void printPair(const std::pair<First, Second>& p) { std::cout << p.first << ", " << p.second; } 可以写成: void printPair(const std::pair<auto, auto>& p) { std::cout << p.first << ", " << p.second; } 它确实可以编译,并且可以很好地与实验性GCC实现概念配合使用。 它是C ++ 20的合法语法吗?
22 c++  templates  auto  c++20 

1
在自己的初始化器中使用变量
C ++ 20标准草案的[basic.scope.pdecl] / 1在注释中具有以下(非规范性)示例(合并请求3580之前的部分引号,请参见此问题的答案): unsigned char x = x; x使用其自己的(不确定的)值初始化。 这实际上在C ++ 20中具有明确定义的行为吗? 通常T x = x;,由于在初始化完成之前x的值是不确定的,因此表单的自我初始化具有未定义的行为。评估不确定值通常会导致未定义的行为([basic.indent] / 2),但是[basic.indent] /2.3中有一个特定的例外,该例外允许直接unsigned char从unsigned char具有不确定值的左值初始化变量(导致使用不确定值进行初始化) )。 这本身并不会因此导致不确定的行为,但会为其他类型T不属于无符号窄字符类型或std::byte如int x = x;。这些注意事项同样适用于C ++ 17及之前的版本,另请参见底部的链接问题。 但是,即使对于unsigned char x = x;,当前草案的[basic.lifetime] / 7也表示: 类似地,使用不依赖于其值的glvalue的属性,在其生命周期开始之前已得到明确定义。该程序在以下情况下具有未定义的行为: glvalue用于访问对象,或者 [...] 这似乎暗示x示例中的值只能在其生命周期内使用。 [basic.lifetime] / 1说: [...] 类型为T的对象的生存期始于以下情况: [...]和 它的初始化(如果有的话)已经完成(包括真空初始化)([dcl.init]), [...] 因此,x仅在初始化完成后才开始生命周期。但是在引用的示例中,x在x初始化完成之前使用的值。因此,使用具有未定义的行为。 …

2
是POD类型完全等同于琐碎的标准布局类型吗?
在C ++ 20中,不赞成使用POD的概念,因为它是琐碎且标准的布局的无意义的合成特征。但是,C ++ 20草案中POD的定义并不完全是“琐碎的和标准布局”;实际上是: POD类是既是普通类又是标准布局类的类,并且不具有非POD类类型的非静态数据成员(或其数组)。POD类型是标量类型,POD类,此类数组或这些类型之一的cv限定版本。 换句话说,POD类型不仅是琐碎的而且是标准布局的,而且也是递归的。 该递归需求是否多余?换句话说,如果一个类型既是琐碎的又是标准布局,那么它是否也自动递归地变得琐碎又是标准布局?如果答案为“否”,那么标准布局,琐碎类型却无法成为POD的例子是什么?


2
为什么same_as概念两次检查类型相等性?
在https://en.cppreference.com/w/cpp/concepts/same_as上查看same_as概念的可能实现,因为我注意到正在发生奇怪的事情。 namespace detail { template< class T, class U > concept SameHelper = std::is_same_v<T, U>; } template< class T, class U > concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>; 第一个问题是为什么要插入一个SameHelper概念?第二个就是same_as检查是否T相同U和U一样T?这不是多余的吗?
19 c++  c++20  concept 

4
连续枚举C ++ 11
有没有一种方法可以在C ++ 11中检查枚举是否连续? 给出一个不是的枚举值是完全有效的。在C ++ 14,C ++ 17或C ++ 20中是否可能有类似类型特征的功能来检查枚举是否连续?这将在static_assert中使用。 一个小例子如下: enum class Types_Discontinuous { A = 10, B = 1, C = 100 }; enum class Types_Continuous { A = 0, B = 1, C = 2 }; static_assert(SOME_TEST<Types_Discontinuous>::value, "Enum should be continuous"); // Fails static_assert(SOME_TEST<Types_Continuous>::value, "Enum should be …
17 c++  c++11  c++14  c++17  c++20 

1
为什么C ++标准会处理文件查找方式?
C ++使用该streamoff类型表示(文件)流中的偏移量,并在[stream.types]中定义如下: using streamoff = implementation-defined ; 类型streamoff是已签名的基本整数类型之一的同义词,该基本整数类型的大小足以表示操作系统的最大可能文件大小。287) 287)通常很长很长。 这是有道理的,因为它允许在大型文件中进行查找(与使用相比long,后者可能只有32位宽)。 [filebuf.virtuals]定义了basic_filebuf在文件中进行搜索的功能,如下所示: pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override; off_type等价于streamoff,请参见[iostreams.limits.pos]。但是,该标准随后继续说明了该功能的作用。最后一句话让我很生气,这需要调用fseek: 效果:width表示a_codecvt.encoding()。如果is_open() == false是或off != 0 && width <= 0,则定位操作将失败。否则,如果way != basic_ios::cur或off != 0,并且输出了最后一个操作,则更新输出序列并写入所有未移位序列。接下来,寻找新的位置:if width > 0,请致电fseek(file, width * off, whence),否则请致电fseek(file, 0, whence)。 fseek接受long参数。如果off_type和streamoff被定义为long long(如标准所建议),则可能导致向下转换为long调用时fseek(file, width * …


2
[[no_unique_address]]和两个相同类型的成员值
我玩弄[[no_unique_address]]在c++20。 在cppreference的示例中,我们有一个空类型Empty和Z struct Empty {}; // empty class struct Z { char c; [[no_unique_address]] Empty e1, e2; }; 显然,的大小Z至少必须是2因为e1和的类型e2相同。 但是,我真的很想拥有Zsize 1。这让我开始思考,如何Empty在包装类中使用额外的模板参数来包装,这些模板参数会强制执行e1和类型的不同e2。 template <typename T, int i> struct Wrapper : public T{}; struct Z1 { char c; [[no_unique_address]] Wrapper<Empty,1> e1; [[no_unique_address]] Wrapper<Empty,2> e2; }; 不幸的是,sizeof(Z1)==2。是否有使大小Z1成为一体的技巧? 我有测试此gcc version 9.2.1与clang version 9.0.0 在我的应用程序中,我有很多空类型的表格 …

1
为什么约束函数允许未定义的行为?
C ++中的常量表达式具有非常整洁的特性:它们的求值不能具有未定义的行为(7.7.4.7): 表达式e是核心常量表达式,除非按照抽象机([intro.execution])的规则对e求值,将求出以下值之一: ... 一种操作,其操作将具有本文档的[引言] [cpp]中指定的未定义的行为[注意:例如,包括有符号整数溢出([expr.prop]),某些指针算术([expr.add],除以零或某些移位操作-尾注]; 尝试将13!in 的值存储在constexpr int确实产生一个不错的编译错误: constexpr int f(int n) { int r = n--; for (; n > 1; --n) r *= n; return r; } int main() { constexpr int x = f(13); return x; } 输出: 9:19: error: constexpr variable 'x' must be initialized …

2
为什么C ++ 20之前std :: swap没有标记为constexpr?
在C ++ 20中,std::swap成为一个constexpr函数。 我知道标准库在标记事物方面确实落后于该语言constexpr,但是到了2017年,<algorithm>它和许多其他事物一样已经成为constexpr了。但是- std::swap不是。我隐约记得有一些奇怪的语言缺陷阻止了这种标记,但是我忘记了细节。 有人可以简洁明了地解释吗? 动机:需要理解为什么在C ++ 11 / C ++ 14代码中标记std::swap()类似函数的想法可能不是一个好主意constexpr。

2
std :: chrono :: years的存储空间真的至少是17位吗?
来自cppreference std::chrono::years (since C++20) duration</*signed integer type of at least 17 bits*/, std::ratio<31556952>> 使用libc++,它似乎的强调存储std::chrono::years就是short其中签订16位。 std::chrono::years( 30797 ) // yields 32767/01/01 std::chrono::years( 30797 ) + 365d // yields -32768/01/01 apparently UB cppreference上有错别字吗? 例: #include <fmt/format.h> #include <chrono> template <> struct fmt::formatter<std::chrono::year_month_day> { char presentation = 'F'; constexpr auto parse(format_parse_context& ctx) { …
14 c++  chrono  c++20  libc++ 

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.