草庐IT

成员方

全部标签

c++ - 为什么不允许将右值引用绑定(bind)到非 const 引用,但允许在一个上调用非 const 成员函数

就危险性而言,以下内容大致相同,但语言不允许使用后两个,而第一个则不是。#include#includeintmain(){std::vectorv;//allowedstd::vector().swap(v);//notallowedv.swap(std::vector());//notallowedstd::swap(std::vector(),v);}我知道VisualStudio允许所有这些作为编译器扩展通过,我忽略了这个问题。我实际上并不是在争论第一个是不允许的——我实际上更喜欢第二个是允许的(有些地方这会使代码更优雅,通常当C++允许你做一些可能很危险但让它通过可能是有益的

c++ - 为什么不能将 mem_fn 应用于 std::string 的成员函数?

structint_holder{intvalue;inttriple(){returnvalue*3;}};intmain(intargc,constchar*argv[]){std::stringabc{"abc"};int_holderone{1};autof1=mem_fn(&std::string::clear);autof2=mem_fn(&int_holder::triple);f1(abc);f2(one);}我在Xcode中测试这样的代码,编译器发出这样的错误似乎mem_fn可以用于用户定义类的成员函数,但不能用于标准字符串的成员函数,有什么不同,为什么?感谢您的阅读

c++ - 防止模板化成员函数中某些参数的隐式转换

目前我有一个这样定义的成员函数:templateboolupdateParameter(conststd::string&name,constT&data);指针重载。templateboolupdateParameter(conststd::string&name,T*data);我希望能够像这样使用这个函数:inttest=20;updateParameter("name",0);updateParameter("Referencedparameter",&test);这样我就可以拥有一个参数对象,该对象要么拥有它所代表的数据,要么指向用户拥有的成员。现在我遇到的问题是当前设置MS

c++ - GCC 无法优化涉及成员函数指针的委托(delegate) lambda 函数

我使用GCC4.9.2和clang3.6.0编译了以下c++14代码。我使用了-O3标志。#includestructS{inta;intA()const{returna;}};templateintFunc(F&&f,Args&&...args){returnf(std::forward(args)...);}usingPtrA=int(S::*)()const;intF(Sconst&s,PtrAptr){return(s.*ptr)()*5;}intp(Sconst&s){returns.A()*5;}intP1(Sconst&s){returnFunc(&F,s,&S::A);

c++ - 具有单个参数模板的成员函数包装器?

我做了一个模板函数,它接受一个成员函数作为参数。但是,由于类必须先声明才能用作成员函数参数的一部分,因此我必须将其作为一个单独的参数:templatefunctionmethodWrap(){}这意味着当显式实例化模板时(我希望这些包装器在编译时生成,而不是将成员指针作为参数传递)我在使用它时必须输入两次:functionsomeFunc=wrapMethod();为什么我不能写这样的东西:templatefunctionmethodWrap(){}并让它捕获C的类型及其成员函数指针,而无需键入两次SomeClass?或者为什么我不能将它包装在一个将C声明为“自由变量”然后具有执行推导

c++ - 仅在类中使用静态成员

只包含静态数据成员的类是否明智?我要实现的类如下所示:classmyClass{private://listofstaticdatamemberspublic://setofmethods}这些方法使用静态数据并在运行时修改它们。我从来没有写过一个只使用静态数据的类,但其中7个成员对我来说看起来有点奇怪。所以我想知道这是否符合C++程序标准。 最佳答案 恕我直言,这种方法没有任何问题。它看起来有点java风格。静态成员基本上充当封装在类中的全局变量。将它们放在类中的好处是可以通过自然的方式定义setter和getter(在您的情况下

c++ - noexcept(false) 析构函数覆盖所有特殊成员函数的异常规范?

考虑这个类TstructT{T()noexcept(true){}T(T&&)noexcept(true){}T(constT&)noexcept(true){}T&operator=(T&&)noexcept(true){return*this;}T&operator=(constT&)noexcept(true){return*this;}~T()noexcept(false){}};考虑这个简单的测试程序:intmain(){constexprbooldefault_ctor=noexcept(T());static_assert(default_ctor==true,"Defa

c++ - 如何在 LLVM 中获取结构成员的值?

所以我用这个创建了一个结构类型:llvm::StructType*llvm_struct=llvm::StructType::create(llvm_context,struct_name);std::vectormembers;for(size_tj=0;j!=struct_data.members.size();j++){llvm::Type*member_type=/*getmembertype*/;members.push_back(member_type);}llvm_struct->setBody(members)我想知道如何访问结构中的成员。到目前为止,我已经尝试过使用g

c++ - 通过命名成员调用虚拟与地址或引用的区别

更新如下:在clang中,通过其名称使用多态对象的左值不会激活虚拟分派(dispatch),但会通过其地址激活。对于下面的基类B和派生D,虚函数something,unionSpace#includeusingnamespacestd;structB{void*address(){returnthis;}virtual~B(){cout如果您的s值为Space,在Clang++中:(更新:错误地声称g++具有相同的行为)如果您执行s.b.something(),将调用B::something(),而不是对s.b执行动态绑定(bind),但是,如果您调用(&s.b)->something

c++ - C++11 中的 3 默认成员弃用规则

根据下表,当用户提供复制赋值、复制构造函数和析构函数中的一个或多个时,C++11中不推荐自动生成默认复制构造函数和复制赋值的编译器(红色单元格表示弃用)。根据“3法则”,这是完全合理的。但是,该表显示在用户提供的复制构造函数/赋值的情况下,默认析构函数的生成并未被弃用。这个设计决定背后的基本原理是什么? 最佳答案 为什么要弃用它?一个对象完全有可能需要特殊的复制属性,但它的销毁完全由它的子对象析构函数决定。考虑一个简单的克隆指针:templateclasscloning_ptr{std::unique_ptrp;public:clo