草庐IT

compound-operator

全部标签

c++ - 如何让 vim 对齐三元组? : operator nicely?

我喜欢像这样使用三元?:运算符编写代码:std::stringresult=input.empty()?createNewItem():processInput(input);如何配置vim,以便在键入createNewItem()后按Return缩进下一行,以便光标与最后一个位于同一列?这样我就可以继续输入:processInput(input);?我尝试查看cinoptions-values设置,但没有看到任何相关信息。 最佳答案 您至少可以部分地通过添加括号来实现这一点:std::stringresult=(input.emp

c++ - 为什么 operator[] 必须是非静态成员函数?

这个问题在这里已经有了答案:Rationaleofenforcingsomeoperatorstobemembers(2个答案)关闭6年前。C++标准规定“=”、“()”、“[]”应该是非静态成员函数。为什么这样指定?为什么要这样定义标准?

c++ - 我们还需要 "placement new"和 "operator new"吗?

allocator似乎与“placementnew”和“operatornew”做了同样的工作。界面更方便。例如:string*ps=static_cast(operatornew(sizeof(string)));new(ps)string("Hello");cout可以重写为allocatoras;string*ps2=as.allocate(1);as.construct(ps2,"Hello");cout那么这意味着“placementnew”和“operatornew”已经过时了吗? 最佳答案 他们仍然需要。您将如何实现您

c++ - C++ 是否为纯虚拟类创建默认值 "Constructor/Destructor/Copy Constructor/Copy assignment operator"?

C++编译器是否为这个“类”生成默认函数,如Constructor/Destructor/Copy-Constructor...?classIMyInterface{virtualvoidMyInterfaceFunction()=0;}我的意思是不可能实例化这个“类”,所以我认为没有生成默认函数。否则,人们会说您必须使用虚拟析构函数。这意味着如果我不定义析构函数virtual它将默认创建,而不是virtual。此外,我想知道为纯虚拟接口(interface)定义虚拟析构函数是否合理,如上所示?(所以这里没有使用指针或数据,所以不需要破坏任何东西)谢谢。 最

c++ - 为什么 `at` 和 `operator []` 没有实现异构比较查找?

自C++14(N3657)成员函数模板find,count,lower_bound,upper_bound,关联容器的equal_range支持异构比较查找,但at和operator[]没有那些等效的成员函数模板。为什么会这样?例子:std::map>m;//...autoit=m.find("foo");//doesnotconstructanstd::stringauto&v=m.at("foo");//constructanstd::string 最佳答案 原则上没有合乎逻辑的理由。例如operator[]一个合理的语义可能是

c++ - 我可以在 operator= 中使用 placement new(this) 吗?

背景:我有一个包含许多变量的复杂类。我有一个可靠且经过测试的复制构造函数:Applepie::Applepie(constApplepie©):m_crust(copy.m_crust),m_filling(copy.m_filling){}在初始化列表中调用的一些成员变量拷贝构造函数执行分配。问题:我需要创建operator=。我可以简单地执行以下操作,而不是使用赋值而不是初始化列表来复制现有的构造函数,并释放正在被替换的内存等等,而是可以简单地执行以下操作:Applepie&Applepie::operator=(constApplepie©){if(this!=&

c++ - 尝试包装函数返回值时出现 "<class name> does not provide a call operator"错误

我正在尝试编写一个函数,它将一个仿函数作为参数,调用仿函数,然后返回它的返回值,并将其包装在boost::shared_ptr中。以下拒绝编译,我完全没有想法。我得到“std::vector不提供调用操作符”(大致)。我在MacOSX上使用Clang3.1。templateboost::shared_ptrReturnValueAsShared(boost::functionfunc){returnboost::make_shared(func());}这是我尝试使用它的上下文:make_shared>>>(bind(ReturnValueAsShared>,bind([afuncti

c++ - 仿函数 : templated struct vs templated operator()

标准库函数对象的通常模式是拥有一个带有非模板operator()的模板化结构。例如,std::less看起来像这样:templatestructless{booloperator()(constT&lhs,constT&rhs)const{returnlhsvec=...;std::sort(vec.begin(),vec.end(),less{});我的问题是,为什么这比具有模板化operator()的非模板结构更好?看起来上面的仿函数在操作上等同于:structless2{templatebooloperator()(constT&lhs,constT&rhs)const{retu

c++ - 为什么 std::unique_ptr 没有 operator<<?

C++11标准中的[util.smartptr.shared.io]要求operator为了shared_ptr小号:templatebasic_ostream&operator&os,shared_ptrconst&p);然而,除非我遗漏了它,否则我在[unique.ptr]中看不到任何类似的东西,而且引用en.cppreference.com同意。有没有理由区别? 最佳答案 Isthereareasonforthedifference?不,没有。与make_unique一样,这是一个“疏忽”,应该在将来添加(如果有人愿意发送提案

c++ - 当对象同时提供 `operator!` 和 `operator bool` 时,在表达式 `!obj` 中使用?

我遇到了一个我自己无法回答的问题。另外,我在谷歌和这里都没有找到这个问题的答案。比如说,我想在if子句中“检查对象的有效性”,如下所示:MyClassmyObject;//[somecode,ifany]if(!myObject){//[dosomething]}让MyClass定义如下:classMyClass{public:MyClass(){};virtual~MyClass(){};booloperator!(){return!myBool;};operatorbool(){returnmyBool;};private:boolmyBool=0;};我现在的问题是:这个if子句