草庐IT

OPERATOR

全部标签

c++ - 从 std::deque 线程安全地同时调用 emplace_back() 和 operator[]() 吗?

来自emplace_back()的文档摘录:IteratorvalidityAlliteratorsrelatedtothiscontainerareinvalidated,butpointersandreferencesremainvalid,referringtothesameelementstheywerereferringtobeforethecall.DataracesThecontainerismodified.Nocontainedelementsareaccessedbythecall:concurrentlyaccessingormodifyingthemissafe

c++ - 一个 const std::function 包装一个非常量 operator()/mutable lambda

考虑以下示例:#include#includestructA{inti;voidoperator()(){std::coutconst&fun){fun();}intmain(){conststd::functionf{A{}};test(f);test(f);}在这里,conststd::function能够调用非constoperator().输出:12如果我提供一个mutablelambda,也会发生同样的情况,例如test([x=0]()mutable{++x;});这怎么可能?conststd::function可以包装可变仿函数是否正常? 最佳答

c++ - 新建/删除 "override"与 "overload"

我一直以为...覆盖意味着在基类中重新实现一个函数(相同的签名)而重载是指实现同名不同签名的函数...并感到困惑,因为有时人们根本不在乎差异。关于新建/删除:它们是重载还是被覆盖?一个想法:在Class=overload中实现new/delete运算符重新实现全局new/delete=override有什么更正/建议/异议?并随时将问题标记为“hairsplitting”... 最佳答案 对于全局的operatornew和operatordelete,其实既不是重载也不是覆盖。允许程序用自己的定义替换默认的、实现提供的定义。C++标

c++ - 运算符删除导致堆损坏,而运算符新工作正常

我已经让operatornew工作了,但是当我调用delete时,它​​在free(ptr)行崩溃了。任何人都可以告诉我在这个基类中重载operatornew和delete时我做错了什么吗?提示:我不是在问设计问题。classBase{private:inti;public:Base():i(10){}staticvoid*operatornew(size_tsize){if(size=0)size=1;//pleasereadthislinecarefully!size=0!returnmalloc(size);}staticvoidoperatordelete(void*ptr,s

c++ - 列表中 -> 运算符的语义(以及一般的 C++)

我目前的任务是编写一个带有迭代器的列表。与创建迭代器类一样,列表不是问题。从几个来源,我看到我有两个运算符要在我的迭代器类中定义:operator*和operator->。到目前为止太棒了!假设我的迭代器结构是这样的//NestedclassofListclass_Iter{private:ListElem*pCurr;constList*pList;public:_Iter(ListElem*pCurr,constList*list):pCurr_(pCurr),pList(list){}T&operator*(){returnpCurr_->data;}T*operator->()

c++ - 具有基于 protected 基类方法的返回类型的函数

我试图让doSomeMethod()的返回类型与operator()相同在基类中,但如果它被声明为protected,编译器将拒绝带有error:notypenamed'type'in'std::result_of'的代码.如果它是公开的,它就可以工作,但我想知道从那以后我是否也可以让它为protected案例工作。这是重现错误的简单代码。#includeclassbase{protected:intoperator()(){return1;};};classchild:privatebase{autostaticdoSomeMethod()->typenamestd::result_

c++ - 在类定义之外为模板类定义 operator[]()(数组订阅)

我认为这很容易,但它并没有按我预期的方式工作。这里的正确语法是什么?TemplateClass.htemplateclassTemplateClass{T&operator[](size_tn);TemplateClass.cpp#include"TemplateClass.h"templateT&TemplateClass::operator[](size_tn){//memberdeclarationnotfound} 最佳答案 您需要提供整个类名——包括模板参数:templateT&TemplateClass::operato

c++ - 错误 : copy assignment operator not allowed in union

当出现以下错误时,我正在编译下面的代码。我找不到原因。typedefunion{struct{constintj;}tag;}X;intmain(){return0;}error:member`::``::tagwithcopyassignmentoperatornotallowedinunion虽然这段代码使用gcc编译罚款。仅使用g++时出错。 最佳答案 为了拥有某个类类型T的union成员,T的特殊成员函数(默认构造函数、复制构造函数、复制赋值运算符、和析构函数)必须是微不足道的。也就是说,它们必须是由编译器隐式声明和定义的。

c++ - 将 raw operator new、placement new 和 standard delete 结合起来是否合法?

伙计们!出于好奇——以下代码可能不合法,对吗?T*p=::operatornew(sizeof(T));//allocatememoryforaTnew(p)T;//constructaTintotheallocatedmemorydeletep;//deletetheobjectusingthestandarddeleteoperator 最佳答案 没有。您只能删除从新返回的内容-没有异常(exception)。 关于c++-将rawoperatornew、placementnew和s

c++ - 防止继承 operator new 和 delete

(我确实扫描了,但找不到任何类似的东西,如果有欺骗请关闭)。有没有办法防止这两个运算符被继承?例如:structfoo{staticvoid*operatornew(std::size_t){//special}staticvoidoperatordelete(void*p,std::size_t){//special}};structbar:publicfoo{};现在bar将继承这两个运算符-在这种微不足道的情况下,没什么大不了的,如果foo和bar中有数据成员,就会出现问题(在我的情况下更糟,因为foo的分配需要与bar不同!)现在避免这种情况的方法是在bar,我也会实现操作符。