草庐IT

copy-constructor

全部标签

c++ - G++ 4.6 -std=gnu++0x : Static Local Variable Constructor Call Timing and Thread Safety

voida(){...}voidb(){...}structX{X(){b();}};voidf(){a();staticXx;...}假设在进入main之后,f被多个线程(可能竞争)多次调用。(当然,唯一对a和b的调用是上面看到的那些)以上代码在-std=gnu++0x模式下用gccg++4.6编译时:Q1。是否保证至少调用一次a()并在调用b()之前返回?也就是说,在第一次调用f()时,x的构造函数是否会同时调用一个自动持续时间局部变量(非静态)(而不是在全局静态初始化时间)?Q2。是否保证b()只会被调用一次?即使两个线程第一次同时在不同的核上执行f?如果是,GCC生成的代码通过

c++ - STL 容器 move 语义并按值返回 : how many times of copying get avoided away?

我知道在C++11中,move语义已经在STL容器中实现以避免临时对象。人们说现在编写按值返回的函数是完美的。但我对究竟有多少次复制实际上被避免感到困惑。请看下面的例子:vectormyVector(){vectorres;res.push_back(4);res.push_back(5);returnres;}vectorv=myVector();我的理解是在c++03中,myVector返回res的拷贝(4,5复制了一次),在评估vectorv=myVector();时vector的复制构造函数vector(constvector&)被调用(4,5复制了两次)。但是在具有move语

c++ - 显式删除移动构造函数

为什么这样:structA{A(int){cout给我一​​个错误:error:useofdeletedfunction‘A::A(A&&)’以及为什么当我添加这样的移动构造函数时A(A&&){cout它编译得很好,但程序的输出只是constructfromint据我所知,编译器要求构造函数但不使用它。为什么?这对我来说毫无意义。附言我假设Aa=0;相当于Aa=A(0);但为什么既不调用移动构造函数也不调用移动赋值运算符? 最佳答案 根据C++标准(12.8复制和移动类对象)31Whencertaincriteriaaremet,a

c++ - 为什么 Builder 模式比在正在创建的 Class 对象中带有参数的 Constructor 更好?

为什么我们不能在构造函数本身中执行不同的构建步骤。如果构建步骤采用参数,为什么不能将它们作为参数提供给构造函数并在构造函数中用于创建对象。据我所知,在Builder模式中,客户端要创建哪个特定对象;那么在正在创建的类的对象中使用构建器而不是带有参数的构造函数有什么优势? 最佳答案 哦!我得到它。我正在查看维基百科示例并意识到Builder为何有用。当客户端不知道将哪些参数传递给构造函数时,这很有用,因为它非常复杂,因此无法直接调用构造函数并获取对象。因此,他向ConcreteBuilders寻求帮助,他们知道将哪些参数传递给构造函数

c++ - 避免在复制构造函数和 operator= 中重复相同的代码

在C++中,当类包含动态分配的数据时,显式定义复制构造函数、operator=和析构函数通常是合理的。但是这些特殊方法的事件是重叠的。更具体地说,operator=通常首先进行一些破坏,然后进行类似于复制构造函数中的处理。我的问题是如何在不重复相同的代码行并且不需要处理器做不必要的工作(比如不必要的复制)的情况下以最好的方式编写它。我通常有两种帮助方法。一种用于build,一种用于破坏。第一个是从复制构造函数和operator=中调用的。第二个由析构函数和operator=使用。示例代码如下:templateclassMyClass{private://Datamembersintco

c++ - 多重继承引起的C++拷贝构造函数调用不明确

我在执行某项任务时遇到了问题,这是一个练习,而不是一个真正的程序。任务是定义结构D的复制构造函数,其行为方式与编译器生成的复制构造函数完全相同。classOb{};structA{Oba;};structB:A{Obb;};structC:A,B{Obc;};structD:C,A{Obd;};如您所见,结构A在结构D中间接派生了几次,这导致了复制构造函数定义中的歧义,如下所示:D(constD&_d):C(_d),A(_d),d(_d.d){}我的问题是如何正确定义复制构造函数?没有上述定义的代码编译通过,所以看起来应该是可以的。MinGW4.8.1错误信息:zad3.cpp:12:

c++ - 复制省略和异常(exception)

在阅读了cppreference的复制省略之后我想玩异常(exception)和复制省略。所以我在coliru上用gcc7.2写了下面的代码#includeclassException{public:Exception(){std::cout输出constructedcopyconstructed我们可以看到调用了复制构造函数,即使在使用-O2调用gcc时也会发生这种情况。在我看来,根据以下条款,这段代码应该有资格复制省略:Whenhandlinganexception,iftheargumentofthecatchclauseisofthesametype(ignoringtop-l

C++:接口(interface)强制定义copy-constr

有没有什么方法可以让接口(interface)类强制执行复制构造函数的定义,也许还有其他构造函数的定义?在我的例子中,我有一个IResource纯抽象类,我希望所有实现此接口(interface)的类都定义一个复制构造函数、一个用于从文件加载的构造函数和一个用于从内存加载的构造函数. 最佳答案 为了构造一个对象,您需要知道要使用的具体类(否则它怎么知道要分配多少内存,或者要使用哪个虚拟表,等等?)。因此,在处理构造函数时接口(interface)不起作用,您不能使用接口(interface)(纯虚拟)来强制存在这样的构造函数。当你想

C++11:传递值参数初始化中转换构造函数和转换函数之间的歧义?

#includeusingnamespacestd;structY;structX{X(constY&){cout在上面,转换函数被我的编译器(gcc4.6.1)赋予了转换构造函数的优先权,但是在标准中它声明:User-definedconversionsareappliedonlywheretheyareunambiguous在这种情况下似乎存在歧义。谁能解释一下矛盾?我原以为上面的代码不会编译。我也很确定几年前ScottMeyers写了关于这个特定示例的文章,并说它无法编译。我错过了什么? 最佳答案 因为X构造函数需要一个con

c++ - 为什么我不能直接将 to_lower_copy 传递给 transform 而不是将其包装在 lambda 中?

我正在尝试使用boost::to_lower_copy和std::transform来小写一堆字符串。如下,变体1,使用lamdba工作;变体2还可以证明这是编译器选择的正确模板重载。但是lambda很傻——它所做的只是将单个参数转发给boost::to_lower_copy。但是变体3,直接使用函数模板不会编译,即使我实例化它。我错过了什么?我有clang版本3.3(tags/RELEASE_33/rc3),使用libstdc++-4.8.1-1.fc19.i686和boost-1.53​​.0-14.fc19.i686。vectorstrings={"Foo","Bar"};vec