草庐IT

强引用

全部标签

c++ - 函数指针引用参数转换为const

示例代码:classFoo;typedefvoid(*fnptr)(Foo&foo);fnptrgFn;voidmyfoo(constFoo&foo){}intmain(){gFn=&myfoo;}使用clang失败并出现以下错误:main.cpp:9:9:error:assigningto'fnptr'(aka'void(*)(Foo&)')fromincompatibletype'void(*)(constFoo&)':typemismatchat1stparameter('Foo&'vs'constFoo&')gFn=&myfoo;^~~~~~~1errorgenerated.G

c++ - 编译器推导超出范围的变量的右值引用

为什么编译器不会自动推断出变量即将超出范围,因此将其视为右值引用?以这段代码为例:#includeintfoo(std::string&&bob);intfoo(conststd::string&bob);intmain(){std::stringbob("");returnfoo(bob);}检查汇编代码清楚地表明,const&版本的“foo”在函数末尾被调用。此处的编译器资源管理器链接:https://godbolt.org/g/mVi9y6编辑:澄清一下,我不是在寻找有关移动变量的替代方法的建议。我也不想理解为什么编译器选择foo的const&版本。这些是我理解得很好的事情。我有

c++ - 何时更喜欢 const 左值引用而不是右值引用模板

目前正在阅读cpr请求库的代码库:https://github.com/whoshuu/cpr/blob/master/include/cpr/api.h注意到这个库的接口(interface)经常使用完美转发。只是学习右值引用,所以这对我来说都是相对较新的。根据我的理解,右值引用、模板化和转发的好处是被环绕的函数调用将通过右值引用而不是值来获取其参数。这避免了不必要的复制。它还可以防止由于引用推导而不得不生成一堆重载。然而,根据我的理解,const左值引用本质上做同样的事情。它避免了重载的需要,并通过引用传递所有内容。需要注意的是,如果被环绕的函数采用非常量引用,它将无法编译。但是,

c++ - C++中的引用和常量混淆

这个问题在这里已经有了答案:assigningchartointreferenceandconstintreferenceinC++(3个答案)关闭5年前。我知道引用只是一个变量的另一个名字,它们在内存中并不作为一个单独的对象存在,但是这里发生了什么doublei=24.7;constint&ri=i;//noticeintherestd::cout我的问题是ri是什么的别名?[某处内存中的值24]

c++ - 将右值传递给非引用参数,为什么编译器不能删除拷贝?

structBig{inta[8];};voidfoo(Biga);BiggetStuff();voidtest1(){foo(getStuff());}编译(在Linux上使用clang6.0.0forx86_64,所以SystemVABI,标志:-O3-march=broadwell)到test1():#@test1()subrsp,72leardi,[rsp+40]callgetStuff()vmovupsymm0,ymmwordptr[rsp+40]vmovupsymmwordptr[rsp],ymm0vzerouppercallfoo(Big)addrsp,72ret如果我没

c++ - 结构化绑定(bind)和引用元组

我在设计一个简单的zip函数时遇到了一个问题,可以这样调用:for(auto[x,y]:zip(std::vector{1,2,3},std:vector{-1,-2,-3}){//...}所以zip将返回类型为zip_range的对象,本身暴露begin和end返回zip_iterator的函数.现在,一个zip_iterator,正如我实现的那样,使用std::tuple-其中Iterators是压缩容器迭代器的类型-以跟踪其在压缩容器中的位置。当我取消引用zip_iterator时,我获得了对压缩容器元素的引用元组。问题是它不适合结构化绑定(bind)语法:std::vector

c++ - 什么是规范地用来提及引用合并的词

在C++中,有一种机制可以在某些模板上下文和函数指针中“合并”引用。void(*)()等同于void()。我一直在尝试用谷歌搜索它,但没有实际的术语是不可能的。 最佳答案 刚刚找到了!!它被称为引用折叠比较https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyersvoidf(int&&¶m);//initialinstantiationoffwithlvalueBecauseofthereference-to-reference,thisi

c# - 在 c# dll 和 c++ dll 之间传递字符串变量作为引用

我有一个c#dll和一个c++dll。我需要将一个字符串变量作为引用从c#传递到c++。我的c++dll将用数据填充变量,我将在C#中使用它,我该怎么做。我尝试使用引用。但是我的c#dll抛出异常。“试图读取或写入protected内存。......这通常表明其他内存已损坏”。关于如何做到这一点的任何想法 最佳答案 作为一般规则,您使用StringBuilder作为引用或返回值,使用string作为您不想/不需要在DLL中更改的字符串。StringBuilder对应LPTSTR,string对应LPCTSTRC#函数导入:[DllI

c++ - Swig:如何包装 double&(double 通过引用传递)?

我正在使用SWIG从Python访问C++代码。我如何优雅地包装一个函数,该函数返回通过引用传递的变量中的值voidset(double&a){a=42.;}我不知道该怎么做。在最好的情况下,我将能够在Python中使用带有Pythonfloat的函数:>>>b=2.>>>set(b)>>>printb42.0目前它给了我一个TypeError:inmethod'TestDouble_set',argument2oftype'double&'。 最佳答案 这样做:你的swig接口(interface)文件:%include%appl

c++ - 使用引用基类成员模板的声明。

谁能解释一下"Ausing-declarationinaderivedclasscannotrefertoaspecializationofatemplateconversionfunctioninabaseclass."它来自ISOC++标准..14.5.2,第7点 最佳答案 这意味着这是错误的:structA{templateoperatorT();};structB:A{usingA::operatorint;};//ill-formed:referstospecialization同样适用于其他函数模板特化(不仅是转换函数)