草庐IT

std-span

全部标签

c++ - 为什么 std::unique_ptr 没有像 std::shared_ptr 那样的别名构造函数?

我刚刚发现std::shared_ptr的“别名构造函数”并发现自己在问“为什么std::unique_ptr没有相应的构造函数?也就是说,如果你想分配一个Foo这样你就可以传递它的Bar应该完全管理Foo生命周期的函数的成员,能够这样做不是很好吗?#includestructB{}structA{Bb;}voidf(std::unique_ptrb);std::unique_ptra=std::make_unique();std::unique_ptrb{std::move(a),&(a->b)};//anowinvalid.f(std::move(b));//fnowrespons

c++ - 在为它分配新值之前应该将 `nullptr` 分配给 `std::unique_ptr` 吗?

#include#includeusingnamespacestd;intmain(){std::unique_ptrptrA=std::make_unique(10);ptrA=std::make_unique(20);//caseIreturn0;}#include#includeusingnamespacestd;intmain(){std::unique_ptrptrA=std::make_unique(10);ptrA=nullptr;//caseIIorptrA.reset()ptrA=std::make_unique(20);return0;}我见过很多人使用CaseII

c++ - 在用户定义的类中清空 std::vector 时未释放内存

当std::vector时我们遇到了一些内存问题是一个类的字段。我们用大量数据填充这个vector,在程序的某个时刻需要释放这些数据。然而,即使vector容量为零,内存也没有释放或完全释放。这里是我们程序的简化版本。如您所见,类Foo只有一个字段:astd::vector.如果我们创建一个std::vector并填写Foo对象,当我们清空每个对象内部的vector时,内存并没有完全释放。我们使用事件监视器测量了内存使用情况,您可以在每个日志行旁边看到每个阶段使用的字节数。此外,我们添加了另一个不使用类Foo的版本对象,在这种情况下,内存被完美释放。#include#includecl

c++ - 可以在构造时修改命名的 std::string 吗?

有谁知道为什么注释行编译失败但未注释行没问题?#includeintmain(){//std::stringfoo("hello").erase(2);//Thisdoesn'tcompile...std::string("hello").erase(2);//...butthisdoes.}包含注释行会导致此错误:main.cpp:Infunction‘intmain()’:main.cpp:5:error:expected‘,’or‘;’before‘.’token谁能解释一下在构造匿名std::string对象时修改匿名对象和命名对象的规则是什么? 最

c++ - 为什么 std::unique_ptr 没有 const get 方法?

我知道std::unique_ptr是这样的,可能不会改变以破坏向后兼容性,但我想知道是否有人有充分的理由说明规范的作者没有这样做'用看起来像这样的const变体重载get方法constT*get()const;遵循unique_ptr为const的意图。我最好的猜测是它试图镜像指针并像T*const而不是典型的类。作为后续问题,如果我想在类的const实例中以类似const的方式保存指针,我是否应该使用std::unique_ptr以外的其他东西来保存数据?更新在我的例子中,我想保护自己不在类本身中滥用指针。我正在编写一个const移动构造函数MyClass(constMyClass

c++ - 移动后是否需要重置 std::list?

我有以下代码:std::listsome_data;...std::listnew_data=std::move(some_data);some_data.clear();...问题是some_data.clear()是否有必要?(备案,some_data以后会重复使用) 最佳答案 是的,这是必要的。只有std智能指针在移动后保证处于默认构造状态。容器处于有效但未指定的状态。这意味着您只能在没有前提条件的情况下调用成员函数,例如clear,将对象置于完全已知的状态。 关于c++-移动后是

c++ - 如何编写正确的 std::initializer_list 构造函数

考虑以下代码:#include#includestructC{std::vectora;std::stringb;boolc;};voidprintC(constC&c){//...}intmain(){printC({{1,2,3},"ehlo",false});}这行得通,因为编译器可以为我生成合适的构造函数。但是,如果我将结构C更改为:structC{std::vectora;std::stringb;boolc;C(){c=false;}};printC调用停止工作,因为编译器停止生成适当的构造函数。我尝试使用std::initializer_list为自己编写一个构造函数,但

c++ - std::holds_alternative 可变参数模板

是否可以将std::holds_alternative包装到可变参数模板中以将其用于更多类型?例如:std::variantvar=4;boolr=std::holds_alternative(var);//holdseitherboolordouble 最佳答案 是的,用一个简单的折叠表达式就可以做到。templateconstexprboolholds_any_of(std::variantconst&v)noexcept{return(std::holds_alternative(v)||...);}

c++ - std::stringstream 如何处理 operator<< 中的 wchar_t*?

鉴于以下代码段无法编译:std::stringstreamss;ss我也不认为这个会:std::stringstreamss;ss但确实如此(至少在VC++上)。我猜这是由于以下ostream::operator过载:ostream&operator如果我不小心混合了字符类型,这是否有可能悄悄地破坏我的代码? 最佳答案 是的-您需要wstringstream用于wchar_t输出。您可以通过不使用字符串文字来缓解这种情况。如您所述,如果您尝试将constwstring&传递给stringstream,它将无法编译。

c++ - 使用默认构造函数初始化 std::vector

我有一个类字段,它是一个std::vector。我知道我希望这个vector包含多少个元素:N。如何用N个元素初始化vector? 最佳答案 std::vector有一个构造函数声明为:vector(size_typeN,constT&x=T());您可以使用它来构造包含N个x拷贝的std::vector。x的默认值是初始化值T(如果T是具有默认构造函数的类类型,则值初始化是默认构造)。使用此构造函数初始化std::vector数据成员非常简单:structS{std::vectorx;S():x(15){}}