草庐IT

copy_pointer

全部标签

c++ - std::move( ) 在没有 move-ctor 的情况下调用 copy-ctor。为什么以及如何预防?

我想知道是否有一种安全编程实践可以在这种微妙的行为发生时提醒编码人员,或者更好的是,首先避免这种行为。structA的用户可能没有意识到没有move构造函数。在他们尝试调用不存在的ctor时,他们既没有收到编译器警告,也没有收到任何运行时指示调用了复制ctor。下面的答案解释了发生的转换,但我看不出这是一件好事的任何理由。如果缺少以const引用作为参数的构造函数,则会出现编译时错误,而不仅仅是解析为非常量引用版本。那么,当类中没有实现move语义时,为什么尝试使用move语义不会导致编译时错误?有没有办法通过一些编译时选项避免这种行为,或者至少有一种在运行时检测它的方法?在move之

c++ - 错误 C2823 : a typedef template is illegal - function pointer

我想使用模板定义一个函数指针类型。但是,VS2013我认为“typedef模板是非法的”。我想写这样的东西:templatetypedefvoid(*FuncPtr)(void*object,SD*data);不幸的是,这无法编译。我想保持简短。基本上我需要为一个函数指针定义一个类型,它的参数是一个模板类。 最佳答案 自C++11起,您可以使用using关键字的效果非常像typedef,它允许模板:templateusingFuncPtr=void(*)(void*,SD*);在此之前,您必须将模板与typedef分开:templa

c++ - 使用 std::copy 的问题

我在使用标准复制功能时收到警告。我声明了一个byte数组。byte*tstArray=newbyte[length];然后我有几个其他字节数组,它们使用一些十六进制值声明和初始化,我想根据一些初始用户输入使用这些值。我有一系列if语句,我使用这些语句基本上解析出原始输入,并基于一些字符串,我选择要使用的字节数组,并在这样做时将结果复制到原始tstArray。例如:if(substr1=="15"){std::cout我得到的警告是警告C4996:“std::copy”:带参数的函数调用那可能不安全-此调用依赖于调用者检查传递的值是正确的。我认为,一个可能的解决方案是使用-D_SCL_S

c++ - 为什么 std::copy(从 istream 到 ostream)会引发 ios::failure 异常?

以下代码应将数据从wifstream复制到wcout。复制内容后,程序抛出ios::failure异常。#include#include#include#include#include#include#includeintmain(void){std::locale::global(std::locale(""));std::wifstreamis;is.exceptions(std::ios::failbit|std::ios::badbit);is.open("test.ts",std::ios::binary);is>>std::noskipws;std::istream_ite

c++ - 视觉 C++ : forward an array as a pointer

我已经将一些无法在VisualStudio2015上编译的C++11代码缩减为以下我认为应该编译的代码(并且使用clang和gcc):#includevoidtest(constchar*x);intmain(){constcharx[]="Helloworld!";test(std::forward(x));}我知道这里不需要调用forward。这是从一段更复杂的代码中删除的,该代码将可变参数中的任何数组衰减为指针并转发所有内容。我确信可以通过模板特化或SFINAE找到解决此问题的方法,但我想在走那条路之前知道它是否有效的C++。编译器是VisualStudio2015,问题可以重现

c++ - std::copy_n 是否适用于重叠范围?

我正在查看N348525.3.1[alg.copy]中的C++标准,它定义了4种算法:复制copy_backwardcopy_ifcopy_n在copy的描述中,有这个注释25.3.1[alg.copy]/3:Requires:resultshallnotbeintherange[first,last)也就是说,当范围重叠时,copy并不总是正确工作(类似于memcpy)。copy_backward和copy_if有相似的语言禁止重叠范围(分别为25.3.1[alg.copy]/14和25.3.1[alg.copy]/8).但是copy_n没有这样的禁止,也没有copy_n_backw

c++ - 智能指针删除器和名称为 "using"的 "pointer"关键字

前段时间看到这样一段代码:void*Create(){int*t{newint{10}};returnt;}classDeleter{//uncommentinordertocompile//usingpointer=void*;public:voidoperator()(void*t){deletet;}};unique_ptrptr{Create()};它不编译。对于VS2013,它说:error:C2440:'initializing':cannotconvertfrom'initializer-list'to'std::unique_ptr'Noconstructorcould

c++ - 错误 : base class 'A1' has private copy constructor

在windows平台上使用Clang3.7见以下代码:classA1{public:A1(char*name){}virtual~A1(){}private:A1(constA1&){}};classB1:publicA1{public:B1():A1(""){}};我收到以下错误:MyFile(31):8:error:baseclass'A1'hasprivatecopyconstructorB1():A1(""){}^MyFile(25):2:note:declaredprivatehereA1(constA1&){}^公开A1复制构造函数,消除错误!这里发生了什么?注意:通过改变

c++ - 如何使用 std::copy 读取任意数量的值?

我正在尝试编写与此相反的操作:std::ostreamouts;//properlyinitializedofcoursestd::setmy_set;//dittoouts(outs));应该是这样的:std::istreamins;std::set::size_typesize;ins>>size;std::copy(std::istream_iterator(ins),std::istream_iterator(ins)???,std::inserter(my_set,my_set.end()));但我坚持使用“结束”迭代器——输入交互器不能使用std::advance并且我也不

c++ - "function"类型的优点是什么(不是 "pointer to function")

阅读C++标准,我看到有“函数”类型和“函数指针”类型:typedefintfunc(int);//functiontypedefint(*pfunc)(int);//pointertofunctiontypedeffunc*pfunc;//sameasabove我从未见过在示例之外使用的函数类型(或者我可能没有意识到它们的用法?)。一些例子:funcincrease,decrease;//declarestwofunctionsintincrease(int),decrease(int);//sameasaboveintincrease(intx){returnx+1;}//cann