草庐IT

ref-link-section-d

全部标签

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

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

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++ - 我可以创建多少个 CRITICAL_SECTION?

我可以初始化和使用的关键部分的数量是否有限制?我的应用程序创建了许多(几千个)需要线程安全的对象。如果我在每个部分中都有一个关键部分,那会占用太多资源吗?我认为因为我需要声明我自己的CRITICAL_SECTION对象,所以我不会像使用Win32Mutex或Event那样浪费内核资源?但我只是有一个挥之不去的疑问...?老实说,并不是所有这些对象都需要对我的应用程序来说是线程安全的,但关键部分位于库中的某个低级基类中,我确实需要一个几千个!我可能有机会修改这个库,所以我想知道是否有任何方法可以延迟创建(然后从那时起使用)临界区,只有当我检测到对象正在从不同的线程使用到它是在哪一个创建的

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

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

c++ - 通过 const ref 传递整数类型有什么好处

问题:通过const引用而不是简单地通过值传递整数类型是否有好处。即。voidfoo(constint&n);//case#1对比voidfoo(intn);//case#2对于用户定义的类型,答案很明确,案例#1避免了不必要的复制,同时确保了对象的常量性。但是在上面的例子中,引用和整数(至少在我的系统上)是相同的大小,所以我无法想象函数调用需要多长时间(由于复制)。但是,我的问题确实与内联函数的编译器有关:对于非常小的内联函数,编译器是否必须在情况#2中复制整数?通过让编译器知道我们不会更改引用,它可以内联函数调用而无需不必要地复制整数吗?欢迎提出任何建议。

c++ - 使用 ref-qualifiers 的重载决议

在使用ref-qualified函数重载时,我从GCC(4.8.1)和Clang(2.9和主干)得到了不同的结果。考虑以下代码:#include#includestructfoo{int&bar()&{std::coutClang编译它并输出"constrvalue",而GCC认为这是一个含糊不清的调用,两个const限定函数都成为最可行的候选人。如果我提供所有4个重载,那么两个编译器都会输出"non-constrvalue"。我想知道哪个编译器-如果有的话-正在做正确的事情,以及相关的标准部分是什么。注意:这一点真正重要的原因是实际代码将两个const限定函数都声明为constexp

c++ - 使用 mingw-w64 工具链时,以 Release模式链接的 Regex Boost 库会发出 "duplicate section has different size"警告

在Release模式下链接我的项目时,我收到以下警告:myProject-libs/release/libboost_regex-mt-s-1.50.0.a(cpp_regex_traits.o):duplicatesection`.data$_ZZN5boost16cpp_regex_traitsIcE21get_catalog_name_instEvE6s_name[boost::cpp_regex_traits::get_catalog_name_inst()::s_name]'hasdifferentsize我怀疑原因可能是boost库的编译选项与我在项目中使用的选项不同,但我

c++ - 什么是 "orthogonal linked list"?

我明白什么是链表,但我的问题是什么是正交链表?我在网上搜索但找不到任何有用的信息。最近在研究C++中的likedlist,如果有关于链表的好书请指点。 最佳答案 这不是一个很常见的术语,但是,根据theDictionaryofComputing,它是一个多维链表,其元素包含指向每个维度中邻居的指针。取一个简单的矩阵:123456789然后,元素5将有一个指向4和6的指针,但也指向2和8。以下问题可能对C++书籍有帮助:TheDefinitiveC++BookGuideandListhttps://stackoverflow.com/