草庐IT

copy-constructor

全部标签

c++ - 调用 placement new 时,将指针强制转换为 "void*"有什么影响吗?

我正在审查自定义容器的代码,它的某些部分创建了如下元素:::new((void*)&buffer[index])CStoredType(other);有些人是这样的:::new(&buffer[index])CStoredType(other);所以两者都使用placementnew来调用复制构造函数来通过复制其他元素来创建元素,但在一种情况下,指向新元素存储的指针按原样传递,而在另一种情况下,它被转换为void*。转换为void*有什么影响吗? 最佳答案 是的,您可以为非空指针重载operatornew。强制转换确保采用void指

c++ - 空范围的 std::copy() 或 std::move() 是否需要有效目的地?

下面代码中的std::move()在VisualStudio2013(使用Debug配置)中编译时发出运行时警告,因为它检测到dest是一个空指针。但是,源范围是空的,因此永远不应访问dest。C++标准可能不清楚这是否应该被允许?它声明:要求:结果不得在[first,last]范围内。nullptr似乎可以满足该要求。#include#includeintmain(){std::vectorvec;int*dest=nullptr;//Therange[begin(vec),end(vec))isempty,sodestshouldneverbeaccessed.//However,

c++ - C++ 11统一初始化时出现“结构初始化程序中的过多元素”错误

我对以下编译器错误感到惊讶:templatestructA{A(Tt):t_{t}{}Tt_;};structS{};intmain(){As{S{}};}错误是(有clang):test.cpp:4:16:error:excesselementsinstructinitializerA(Tt):t_{t}{}^test.cpp:15:10:note:ininstantiationofmemberfunction'A::A'requestedhereAs{S{}};^GCC给出了类似的错误。我希望表达式t_{t}尝试从t复制构造t_。由于S有一个隐式生成的复制构造函数,我认为这不会成为

c++ - 为什么不调用复制构造函数?

在这段代码中:#includeusingstd::cout;classFoo{public:Foo():egg(0){}Foo(constFoo&other):egg(1){}integg;};Foobar(){Foobaz;baz.egg=3;returnbaz;}intmain(void){Foospam(bar());cout输出是3,而我预计它是1。这意味着在Foospam(bar())行中没有调用复制构造函数。我猜这是因为bar函数没有返回引用。能否请您解释一下spam初始化时到底发生了什么?如果这是一个愚蠢的问题,我提前道歉。谢谢! 最佳答案

c++ - 不同类型的 copy_if

如果我知道如何提取匹配类型,是否有一种现代方式来表达有条件地从不同类型的源容器复制到目标容器的意图?将问题作为代码示例提出更容易:#include#includestructFoo{};structFooBar{boolis_valid;Foofoo;};std::vectorget_valid_foos(conststd::vector&foobars){std::vectorvalid_foos;for(constauto&fbar:foobars){if(fbar.is_valid)valid_foos.push_back(fbar.foo);}returnvalid_foos;

c++ - copy-and-swap 习语的低效率?

我正在测试一些代码,其中类中有一个std::vector数据成员。该类既可复制又可移动,operator=的实现方式如here所述。使用copy-and-swap习语。如果有两个vector,比如v1大容量,v2小容量,v2被复制到v1(v1=v2),赋值后保留v1中的大容量;这是有道理的,因为接下来的v1.push_back()调用不必强制进行新的重新分配(换句话说:释放已经可用的内存,然后重新分配它以增加vector没有多大意义).但是,如果对以vector为数据成员的类进行相同的赋值,则行为不同,并且在赋值之后更大的容量是不保留。如果copy-and-swap惯用语不被使用,复制

c++ - 为什么 `std::copy` 在我的测试程序中从 char 缓冲区读取一个 int 比 `memcpy` 慢 5 倍(!)?

这是thisquestion的后续行动我在哪里发布了这个程序:#include#include#include#include#include#include#include#include#includeclassStopwatch{public:typedefstd::chrono::high_resolution_clockClock;//!ConstructorstartsthestopwatchStopwatch():mStart(Clock::now()){}//!Returnselapsednumberofsecondsindecimalform.doubleelapse

c++ - 为什么复制构造函数的参数是引用而不是指针?

为什么拷贝构造函数的参数是引用而不是指针?为什么我们不能使用指针来代替? 最佳答案 有很多原因:引用不能为NULL。好的,可以创建NULL引用,但也可以转换std::vector*进入std::vector*.这并不意味着这样的转换具有定义的行为。创建NULL引用也不会。指针设置为NULL时具有定义的行为;引用没有。因此,引用总是指的是实际对象。变量和临时变量不能隐式转换为指向其类型的指针。出于显而易见的原因。我们不希望指向临时对象的指针到处乱跑,这就是标准明确禁止这样做的原因(至少当编译器可以告诉您正在这样做时)。但是我们可以引用

c++ - 我怎么说 "noexcept if execution of protected base constructor is noexcept"?

我们遇到过这种情况,想知道解决它的最佳方法templatestructA:T{A(T&&t)noexcept(noexcept(T(std::move(t)))):T(std::move(t)){}};不幸的是编译失败,因为T的移动构造函数是protected,我们只能在*this的构造函数初始化列表中调用它。使这项工作有什么变通办法,或者甚至有标准的方法吗? 最佳答案 您正在寻找noexcept(std::is_nothrow_move_constructible::value):http://en.cppreference.co

c++ - 重用 copy-and-swap 习惯用法

我正在尝试将copy-and-swap习惯用法放入可重用的混音中:templatestructcopy_and_swap{Derived&operator=(Derivedcopy){Derived*derived=static_cast(this);derived->swap(copy);return*derived;}};我打算通过CRTP将其混入:structFoo:copy_and_swap{Foo(){std::cout然而,一个简单的测试表明它不起作用:Foox;Fooy;x=y;这只会打印两次“default”,既不会打印“copy”也不会打印“swap”。我在这里缺少什