草庐IT

ref-parameters

全部标签

c++ - 为什么 shared_ptr 实现中的 ref_count 是 int*

我见过几个shared_ptr的实现,例如here.它们都将ref_count声明为int*。我不明白如果它只是一个int我们会失去什么。谢谢!templateclassshared_ptr{T*ptr;int*ref_count;/***Initializestherefcountusedfortrackingtheusage.*/voidinitialize_ref_count(){if(ref_count!=nullptr)return;try{ref_count=newint;*ref_count=1;}catch(std::bad_alloc&e){std::cerr

c++ - 如何允许 std :string parameter to be NULL?

我有一个函数foo(conststd::string&str);如果您使用foo(NULL)调用它,它确实会崩溃。我该怎么做才能防止它崩溃? 最佳答案 std::string有一个带有constchar*参数的构造函数。当您将NULL传递给它时,构造函数将崩溃,并且当您编写foo(NULL)时会隐式调用该构造函数。我能想到的唯一解决办法就是重载foovoidfoo(conststd::string&str){//yourfunction}voidfoo(constchar*cstr){if(cstr==NULL)//dosometh

c++ - 带有 const ref 参数的自赋值行为

我偶然发现了一些非常古老的代码,它有一个带有定义的复制赋值运算符的类,该运算符将其参数作为常量引用,但也不检查自赋值,因此本质上:structA{intq;A():q(3){}A&operator=(constA&a){q=a.q;return*this;}};当A的一个实例被赋值给它自己时,这个赋值运算符的行为是什么?我认为这会导致问题,因为它“破坏”了参数的常量性,任何编译器都可以假设参数没有更改并基于此进行优化。然而,clang和gcc都没有发出警告,程序运行正常。如果我在赋值运算符中赋值之前将q的值显式更改为4,这也有效。 最佳答案

c++ - "a declaration shadows a parameter"是什么意思?

我正在尝试创建一个函数,该函数返回我将传递给它的整数的两倍。我的代码收到以下错误消息:declarationof'intx'shadowsaparameterintx;"这是我的代码:#includeintdoublenumber();usingnamespacestd;intdoublenumber(intx)//>a;doublenumber(a);return0;} 最佳答案 您将x作为参数,然后尝试将其也声明为局部变量,这就是对“阴影”的提示。 关于c++-"adeclarati

c++ - 对带有可变参数模板的 std::ref() 和 std::bind() 有点模糊

我已经阅读了很多关于可变参数模板和std::bind的文章,但我认为我仍然不理解它们是如何协同工作的。我认为在使用可变参数模板、std::bind的用途以及它们如何结合在一起时,我的概念有点模糊。在下面的代码中,我的lambda使用点运算符和TestClass类型的对象,但即使我传入std::ref类型的对象,它们仍然有效。这到底是怎么回事?隐式转换是如何发生的?#includeusingstd::cout;usingstd::endl;#include#includeusingstd::forward;classTestClass{public:TestClass(constTest

c++ - 使用 std::move 返回时 "return-by-rvalue-ref"和 "return-by-value"之间的区别?

考虑以下代码:#includeusingnamespacestd;structI{I(I&&rv){coutC包含I。而C::foo()允许您将I移出C。上面使用的成员函数有什么区别:I&&foo(){returnmove(i)};//returnrvalueref和以下替换成员函数:Ifoo(){returnmove(i)};//returnbyvalue对我来说,它们似乎做同样的事情:Ii=c.foo();导致调用I::I(I&&);.本例未涉及的会有什么后果? 最佳答案 撇开您编写的程序是否真正有意义的考虑因素(从数据成员移动

c++ - 构造函数中的 const int ref 可以安全地绑定(bind)到文字吗?

我知道该标准有一个关于延长临时对象生命周期的异常(exception),基本上说在构造函数中绑定(bind)一个const引用不会延长生命周期,但这是否也适用于文字?例如:classC{private:constint&ref;public:C(constint&in):ref{in}{}};如果我有一个函数返回这种类型的对象Cf(){Cc(2);returnc;}如果我知道c.ref的值会在调用者中未定义吗? 最佳答案 否。构造函数完成执行后,您将无法使用该引用。当非类类型的纯右值绑定(bind)到相同类型的const引用时,总是

c++ - std::apply forward parameters 如何在没有显式 std::forward 的情况下应用?

考虑std::apply的可能实现:namespacedetail{templateconstexprdecltype(auto)apply_impl(F&&f,Tuple&&t,std::index_sequence){returnstd::invoke(std::forward(f),std::get(std::forward(t))...);}}//namespacedetailtemplateconstexprdecltype(auto)apply(F&&f,Tuple&&t){returndetail::apply_impl(std::forward(f),std::forw

c++ - g++ 编译器错误 : couldn't deduce template parameter ‘_Funct’

我正在尝试使用ANSIC++for_each语句迭代并打印标准vector的元素。如果我让for_each调用一个非重载函数,它会工作,但如果我让它调用一个重载函数,则会产生编译器错误。这是一个最小的测试程序,用于显示编译器错误发生的位置:#include#include#includestructS{charc;inti;};std::vectorv;voidprint_struct(intidx);voidprint_struct(conststructS&s);//f:anon-overloadedversionoftheprecedingfunction.voidf(const

c# - 与 C++ 相比,C# 'ref' 关键字的使用

我主要使用C++工作,现在我在新工作中使用C#,在阅读此处有关“ref”关键字和C#值与引用类型的一些内容后,我仍然发现它们有些混淆。据我所知,如果您将这些传递给方法,这些将是类似的C++样式:值类型:publicvoidCSharpFunc(value)和publicvoidCPlusplusFunc(value)引用类型:publicvoidCSharpFunc(reference)和publicvoidCPlusPlusFunc(&reference)'ref'/指针publicvoidCSharpFunc(refbar)和publicvoidCPlusPlus(*bar)这是一