草庐IT

copy-constructor

全部标签

c++ - 什么时候应该让一个类不可复制?

根据Googlestyleguidelines,“很少有类需要可复制。大多数类既不应该有复制构造函数,也不应该有赋值运算符。”他们建议您使类不可复制(即,不为其提供复制构造函数或赋值运算符),而是建议在大多数情况下通过引用或指针传递,或使用无法隐式调用的clone()方法。但是,我听到一些反对意见:访问引用(通常)比访问值慢。在某些计算中,我可能希望保留原始对象的原样,只返回更改后的对象。我可能想将计算的值存储为函数中的本地对象并返回它,如果我通过引用返回它,我无法做到这一点。如果一个类足够小,通过引用传递会比较慢。遵循此准则有哪些正面/负面影响?是否有使类不可复制的标准“经验法则”?

c++ - 为什么模板参数上的 is_copy_constructible 静态断言失败?

我试图对模板参数进行静态断言,以检查/强制Type可复制构造。但是静态断言失败。我不明白为什么,也找不到任何文档为什么它会在静态评估中失败。实例化的类是可复制构造的,但是它使用了我认为被称为奇怪的重复模板参数模式的东西。完整的测试代码如下:#include#includeusingnamespacestd;templateclassFunContainer{//static_assert(is_copy_constructible::value,"Typemustbecopyconstructible!");//::value//::value;};};classFun:publicF

c++ - 复制语句如何识别其构造函数

在下面的代码中,当语句Xloc2=loc;被执行时,编译器识别出下​​面的构造函数应该运行,然后运行它。X(constX&x){val=x.val;out("X(X&)");我知道构造函数据说是一个复制构造函数,但我的问题是编译器如何知道构造函数属于该语句?是否有关于复制构造函数的结构应该如何构造以便在执行复制语句时可以识别和运行的规则?#include"std_lib_facilities_4.h"usingnamespacestd;structX{intval;voidout(conststring&s){cerr">ch;return0;}std_lib_facilities是h

c++ - 为什么删除的复制构造函数不允许使用其他具有多态类型的构造函数?

我想知道为什么这个程序不能编译(在msvc、gcc和clang上的行为相同):#includeusingnamespacestd;structAction{virtualvoidaction(){cout按照我的预期,删除的复制构造函数应该让其他ActionDecorator实例构造ActionDecorator,因为它是Action的多态类型。相反,我必须将ActionDecorator实例显式转换为Action&,因为编译器提示试图引用已删除的复制构造函数。是否有一些标准规则可以解释这种行为? 最佳答案 删除函数不会将其从重载决

c++ - 为什么我需要类型 T 的复制构造函数?

我有点不确定什么时候需要复制构造函数。例如,给定这个函数:templateTmax(constT*array,intsize){Tresult=array[0];for(inti=1;i我需要类型T的复制构造函数的原因是什么?我想一定是因为我们按值(value)返回。这行Tresult=array[0];是否也需要复制构造函数? 最佳答案 WhatisthereasonthatIneedcopyconstructorforthetypeT?Tresult=array[0];这被称为复制初始化并调用类型T的复制构造函数。键入T将需要复

c++ - 为什么在 std::copy 期间使用 std::back_inserter 而不是 end()?

我见过std::copy()使用std::back_inserter但我使用了std::end()并且两者都有效.我的问题是,如果std::end()工作正常,为什么还需要std::back_inserter?#include#include#include#includeusingnamespacestd;intmain(){//Declaringfirstcontainervectorv1={1,2,3};//Declaringsecondcontainerfor//copyingvaluesvectorv2={4,5,6};//Usingstd::back_inserterins

c++ - 复制构造函数省略?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Whyhasthedestructorbeencalledonlyonce?鉴于下面的代码,我无法理解gcc中的输出。我希望创建和销毁两个对象,但只看到对构造函数和析构函数的一次调用。这里发生了什么?#include#includestructHuge{Huge(){std::cout这段代码在g++(4.4)中的输出是EnteringgConstructorExitinggBeforeleavingmainDestructor

c++ - std::runtime_error 子类的 "call to deleted constructor of"编译器错误

我从std::runtime_error派生了一个异常类,以便添加对异常流的支持。我收到一个奇怪的编译器错误输出,我不确定如何解决?clang++-std=c++11-stdlib=libc++-g-Wall-I../-I/usr/local/includeMain.cpp-cMain.cpp:43:19:error:calltodeletedconstructorof'EarthException'throwEarthException(__FILE__,__LINE__)^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~../EarthExce

C++ 构造函数阻止成功编译

我在C++中遇到了一个奇怪的问题,希望得到解释。此代码段无法编译:size_tbufLength=18;char*buffer=newchar[bufLength];auto_array_ptrpBuffer1=buffer;//failsauto_array_ptrpBuffer2(buffer);上面的第3行失败并返回Noviableconstructorcopyingvariableoftype'auto_array_ptr'.请注意,下一行编译得很好。Q1)这本身对我来说很奇怪。我认为在必要时使用赋值进行初始化已转换为使用初始化器进行初始化。如果第二个成功,为什么第一个会失败?

c++ - 最烦人的解析 : why doesn't `g( ( f() ) );` call `f` 's default constructor and pass the result to `g` 's ctor that takes a `f` ?

这不是Mostvexingparse:whydoesn'tAa(());work?的拷贝,它基于Aa());形式的解析,其OP认为可以使用额外的集合默认构造一个A对象括号。相比之下,我的问题是关于2个类,f和g,其中f具有默认构造函数,而g的构造函数采用f。我想用一个临时的f参数调用g的构造函数,而不使用统一的初始化语法。g的构造函数中有一个std::cout语句,因此缺少输出表示函数声明而不是g对象实例化。我在注释中用3个数字注释了示例代码。#1和#2编译时#3被注释掉,反之亦然:#includestructf{};structg{g(f){std::cout#1:我认为#1声明了一