草庐IT

c++ - 为什么 std::atomic 在 Visual C++ 中不是简单的类型?

Folly库需要std::atomic应该是一个普通的类型。这适用于gcc和clang,但对于VisualC++即使对于std::atomic也是如此。.为什么std::is_trivial返回false?#include#includestatic_assert(std::is_trivial>::value,"std::atomicnottrivial"); 最佳答案 std::atomic曾经是微不足道的(这需要TriviallyCopyable),但现在不再是了。参见thisanswer以获得有关如何以及为何发生变化的详尽解

c++ - std::vector 默认构造函数可以抛出异常吗

如果我使用默认构造函数(和默认分配器)构造一个空的std::vector,它会抛出异常吗?一般来说,为容器的元素分配空间会抛出异常(即std::bad_alloc)。但是std::vector的默认构造函数并不需要分配任何这样的空间;它可以在第一次插入或赋值时懒惰地分配一些空间。但是C++标准是否要求它不抛出异常(暗示惰性分配,或者捕获std::bad_alloc然后回退到惰性分配)? 最佳答案 这取决于Allocator的默认构造函数。std::vector的默认构造函数声明为vector()noexcept(noexcept(A

C++ std::forward<T> 与 static_cast<T>

据我了解,std::forward(x)相当于static_cast(x).但据我所见,static_cast(x)似乎做同样的事情,如下所示code因此我的问题是为什么std::forward实现为static_cast(x),而不是static_cast(x),如果两者有相同的效果呢? 最佳答案 因为完美转发允许同时传递r值引用和l值引用。这是通过referencecollapsing完成的:T=int-->T&&=int&&T=int&-->T&&=int&&&=int&T=int&&-->T&&=int&&&&=int&&在

c++ - 为什么 std::size_t 在 32 位系统上是 4 个字节,而 unsigned long long 在 32 位和 64 位系统上都是 8 个字节?

问题很简单。在32位系统上:std::cout在64位系统上:std::cout我只检查了MSVC的实现,它看起来像这样:#ifdef_WIN64typedefunsigned__int64size_t;#elsetypedefunsignedintsize_t;#endif那么为什么不在32位和64位系统上制作std::size_tunsignedlonglong(std::uintmax_t)支持吗?还是我错了? 最佳答案 size_t的要点是能够容纳最大可能对象的大小。在32位系统上,任何对象都不能占用超过2**32字节,因此

c++ - std::hash 值在 char* 值上而不是在内存地址上?

如本link所述:ThereisnospecializationforCstrings.std::hashproducesahashofthevalueofthepointer(thememoryaddress),itdoesnotexaminethecontentsofanycharacterarray.这意味着使用相同的char*值,可以产生不同的哈希码。例如,有这样的代码://MOKandMOVaretemplateargumentsvoidemit(MOKkey,MOVvalue){autoh=hash()(key);cout这是通过调用4次emit()对相同的key(使用MO

c++ - std::tie 是否允许隐式转换?

在c++11中,std::tie是否允许隐式转换?以下代码编译并运行,但我不确定幕后到底发生了什么,或者这是否安全。std::tuplefoo(){returnstd::make_tuple(0,0);}doublea,b;std::tie(a,b)=foo();//aandbaredoublesbutfoo()returnsfloats 最佳答案 使用元组移动赋值运算符的模板版本会发生什么templatetuple&operator=(tuple&&other);它使用自己的移动赋值语义一个一个地移动赋值各个元组成员。如果相应的成

c++ - 为什么 GCC 拒绝引用 std::optional?

std::optionalxx;只是不针对最新的gcc-7.0.0快照进行编译。C++17标准是否包括std::optional供引用?为什么不呢?(我猜在专用特化中使用指针的实现不会造成任何问题。) 最佳答案 因为optional,如C++17中的标准化,不允许引用类型。这是设计排除的。这有两个原因。首先是,从结构上讲,一个optional相当于T*.它们可能有不同的界面,但它们做的事情是一样的。第二件事是,标准委员会实际上没有就optional究竟如何的问题达成共识。应该行为。考虑以下几点:optionalot=...;Tt=.

c++ -::std::string 和 std::string 之间有什么区别?

::std::string和std::string有什么区别前者是全局性的?但是global是为了什么?namespacestd不是global吗?谢谢你帮助我。 最佳答案 ::std::string表示全局命名空间中命名空间std中的string。前导::强制查找从全局命名空间开始。因此::std::string始终表示C++标准库中的string类型。std::string表示命名空间std中的string,其中std会在当前查找范围。因此,如果有一个名为std的类、命名空间或枚举,名称查找可能会找到该std。#includen

c++ - std::vector 和 llvm::SmallVector 有什么区别?什么时候使用哪一个?

我试图了解SmallVector容器在LLVM中的使用。我认为std::vector可以用来代替小vector。另外,如果我们在llvm::SmallVector中放入比其大小更多的元素,会发生什么情况? 最佳答案 llvm::SmallVector是为小型阵列优化的vector。这种优化来自于不为有限数量的元素执行堆分配。如果您添加的元素多于描述的使用自动存储分配的元素,它将回退到std::vector的行为并分配越来越大的数组。llvm::SmallVectorsmallVector;for(inti=0;i当您知道您将始终拥有

c++ - 如何将 "nothing"分配给 std::optional<T>?

正在阅读std::optional,我对将something和nothing的值分配给optional的标准方法感到困惑。我想operator=将是为可选值赋值的标准机制。似乎工作。这是否意味着底层对象的拷贝?什么是分配无的标准方法?我见过x={}(这对我来说毫无意义,因为{}是一个空block)和x=std::nullopt。 最佳答案 我不会说有一种“标准”方法可以不给std::optional赋值。如果您阅读theproposal对于std::optional(“添加实用程序类来表示可选对象的提议”),作者按以下顺序提出了两种