草庐IT

弱引用

全部标签

作为 C 回调的 C++ 静态成员函数需要访问非静态引用

在我的C++代码中,我依赖于C库。这个C库让我可以定义一个带有3个参数的回调。示例:文件.c:#ifdef__cplusplusextern"C"{#endiftypedefvoid(*callback)(argument*1,argument*2,argument*3);...voidset_callback(ARG1,callbackname_of_callback);...在我正在开发的C++库中,我希望这个回调成为一个类的成员函数,因为我不能直接将成员函数作为回调传递给C库,我创建了一个静态函数作为回调并在内部这个静态函数我想引用一个类对象并调用它的成员函数来完成工作。现在我的

c++ - 引用元组初始化引用元组

如果我有代码#includeusingVec3=std::tuple;usingVec3Ref=std::tuple;voidstuff(){Vec3foo(0,0,0);Vec3Refbar(foo);}我得到了错误/usr/include/c++/4.6/tuple:100:4:error:bindingofreferencetotype'float'toavalueoftype'constfloat'dropsqualifiers:_M_head_impl(std::forward(__h)){}^~~~~~~~~~~~~~~~~~~~~~~~~~//snip.../usr/in

c++ - 一个 "strong"迭代器指针/引用

是否存在“强”迭代器之类的东西。我的意思是一个迭代器坚持它引用的值而不是它所在的地址,这样如果值被交换到不同的地址,迭代器将继续指向这个新地址中的它;不管它在数据结构中被移动到哪里? 最佳答案 是也不是。但为什么?你想要什么std::iter_swap(strong_a,strong_b);做什么?正如KarolyHorvath指出的那样,您可以实现自己的容器,它有自己的迭代器(迭代器只是一个概念,不是任何一种类型)。至于“实现一个可以很好地与标准库一起工作”的方法,这取决于您想到的是标准库的哪一部分。您不能向容器中添加东西(除非您

c++ - 为什么T 'skips'的模板参数推导是数组元素的const,而函数参数是对T的const引用?

让我们考虑一下这些定义:/***fulltypeinformationwithtypeid***/templateclassType{};templatestd::stringtypeStr(){returntypeid(Type).name();}/***functiontemplateforparameterdeduction***/templatevoidfunc(constT&a){std::cout()()指向常量的指针如果执行以下语句:constinti=5,*ip=&i;func(ip);输出是:DeducedtypeforTis:4TypeI**PKi**E所以T实际上

c++ - 在 C++ 中,说一个变量具有右值引用类型有意义吗?

我对类似X&&x=static_cast(obj_x);的思考方式就是这样,尽管有外表,x最终成为一个普通的左值引用。我最近遇到了thisarticleScottMeyers坚持认为x将是右值引用类型的左值。这是真的有意义,还是没有区别的区别?具体来说,给定X&&x=static_cast(obj_x)或X&x=obj_x;对于x的这两个定义,是否有任何后续代码的行为会有所不同?? 最佳答案 重要的区别在于R值引用是命名的还是未命名的(返回值)。因此,要回答所写的问题,不,没有后续代码会以不同方式对待x的两个定义(除了cpplear

c++ - C++中的自动引用

这段代码在visualstudio2015中给我奇怪的调试信息intmain(){constinti=42;autoj=i;constauto&k=i;auto*p=&i;constautoj2=i,&k2=i;}生成的类型是:&k=constint&&k2=constint*我认为它们都应该是constint&。问题是,为什么我的VisualStudio调试器说&k和&k2是不同的类型? 最佳答案 k和k2都是constint&类型。这是完整的类型列表。请注意,顶级const为auto丢弃类型推导。intmain(){consti

c++ - std::shared_ptr<std::string const> 能否作为引用计数不可变字符串的有效实现?

理想情况下,不可变字符串类只需要为每个字符串分配一个内存。甚至引用计数也可以存储在与字符串本身相同的内存块中。string的简单实现和shared_ptr将为shared_ptr分配三block不同的内存:字符串缓冲区的内存字符串对象的内存引用计数的内存现在,我知道在使用std::make_shared()时,智能实现可以将最后两个组合成一个分配。但这仍然会留下两个分配。当您知道字符串是不可变的时,字符串缓冲区将不会被重新分配,因此应该可以将它与字符串对象集成在一起,只留下一次分配。我知道一些字符串实现已经对短字符串使用了这样的优化,但我正在寻找一个不管字符串长度如何都这样做的实现。我

c++ - STL 容器的右值引用限定符

为什么元素访问STL容器的成员函数,例如std::array::operator[]或std::vector::operator[]没有右值引用限定符重载?我当然可以做到std::move(generate_vector()[10]),但我很好奇在标准化引用限定符时是否考虑添加右值引用限定符重载。我认为std::array和std::tuple实际上是同一件事,后者的“元素访问函数(即std::get)”对于const与非const以及左值与右值的所有组合都重载了。为什么不是前者?将右值引用限定的元素访问成员函数(返回右值引用)添加到我的自定义容器是个好主意吗?编辑RichardCri

c++ - Rcpp 中值和引用参数之间的区别

这个问题在这里已经有了答案:Rcpppassbyreferencevs.byvalue(1个回答)关闭4年前。考虑这两个函数:library(Rcpp)cppFunction("NumericVectorfunc1(NumericVector&x){for(inti=0;i唯一的区别是func1将x作为一个引用参数,而func2将它作为一个值。如果这是常规的C++,我会将其理解为func1被允许在调用代码中更改x的值,而这不会发生在中func2.但是:>xx[1]0.20.40.60.81.01.21.41.61.82.0>func1(x)[1]0.40.81.21.62.02.42.

c++ - 对类型的非常量左值引用 - 使用 Class 类型的参数时 Objective-C++ 包装器中的错误

我有两个用Objective-C++编写的包装器类,用于它们等效的C++类。我们称它们为OABCClass和OXYZCallbackInterface。现在我在C++(ABCClass)中有一个方法,其中一个参数是一个接口(interface)-XYZCallbackInterface。例如:std::stringmethodWithArguments(std::stringreq,CommonNamespace::XYZCallbackInterface&callback);在我的Objective-C++包装器类中,即OABCClass我对上述C++方法的方法实现如下所示:-(NS