草庐IT

void-compatibility

全部标签

C++ 类型转换 : cast a pointer from void pointer to class pointer

如何将指向void对象的指针转换为类对象? 最佳答案 使用static_cast。请注意,只有当指针确实指向指定类型的对象时,您才必须这样做;也就是说,指向void的指针的值取自指向此类对象的指针。thing*p=whatever();//pointertoobjectvoid*pv=p;//pointertovoidthing*p2=static_cast(pv);//pointertothesameobject如果您发现自己需要这样做,您可能需要重新考虑您的设计。你放弃了类型安全,让编写无效代码变得容易:something_el

c++ - 为什么(void)在for循环中的两个逗号分隔语句之间

这个问题在这里已经有了答案:Whydoesstd::transformandsimilarcastthe'for'loopincrementto(void)?(2个回答)What'sthepointof(void)first2++here?[duplicate](1个回答)关闭5年前。以下代码来自cppreference.com上std::lexicographical_compare的实现示例:templateboollexicographical_compare(InputIt1first1,InputIt1last1,InputIt2first2,InputIt2last2){f

c++ - 有没有办法将 shared_ptr<void> 转换为 shared_ptr<T>?

我想保持std::shared_ptr的智能行为。那么有没有办法在不混淆引用计数的情况下将共享的void指针转换为另一种类型?我无法获取原始指针并从中创建新的共享指针。 最佳答案 您可以使用robmayoff'sanswer中的指针转换;但小心点。这里很容易无意触发未定义的行为:structMyClass{};void*rawPtr=newMyClass;shared_ptrexampleVoid(rawPtr);//Undefinedbehavior;//callsdelete(void*)ptr;shared_ptrexampl

c++ - 显式 void 指针作为函数参数

我有一个函数:intfoo(void*ptr){//...}我可以在C++11/14中在语法上(不使用编译器警告等)禁用传递void*本身以外的指针吗?例如,现在可以这样调用:foo(newint(42));我需要禁用它。 最佳答案 我想还有很多其他方法可以做到这一点。使用模板函数很简单(它也适用于C++98)templateintfoo(X*ptr);intfoo(void*ptr){return1;}intmain(){inti;void*vp=&i;foo(vp);//OKfoo(&i);//linkererrorreturn

c++ - void* 或 char* 用于通用缓冲区表示?

我正在设计一个Buffer类,其目的是表示一block内存。我的底层缓冲区是char*(嗯,实际上是boost::shared_array,但这并不重要)。我一直在决定为我的构造函数选择什么原型(prototype):我应该去:Buffer(constvoid*buf,size_tbuflen);或与:Buffer(constchar*buf,size_tbuflen);还是别的什么?通常会做什么,为什么? 最佳答案 API接口(interface)对用户来说更加清晰,如果buffer是void*类型,而string是char*类型

c++ - sizeof(size_t) == sizeof(void*) 总是正确的吗?

C99/C++11标准是否保证sizeof(size_t)==sizeof(void*)总是正确的?size_tf(void*p){return(size_t)(p);//Isitsafe?}void*f(size_tn){return(void*)(n);//Isitsafe?} 最佳答案 不,不能保证。使用intptr_t或uintptr_t将指针安全地存储在整数中。存在/曾经是错误的架构是有意义的,例如分段DOS内存模型。那里的内存是由64k段构成的——一个对象永远不会大于一个段,所以16位size_t就足够了。但是,指针具有

c++ - 为什么我不能将 [](auto&&...){} 转换为 std::function<void()>?

当我尝试编译时:#includevoidf(std::functionf){}voidg(){f([](auto&&...){});}在gcc7.3上,我收到以下错误:[x86-64gcc7.3#1]error:couldnotconvert'g()::{}'from'g()::'to'std::function'有人可以解释为什么这是无效的c++吗?还是我应该提交错误报告?(MSVC14接受并将其编译为我所期望的。) 最佳答案 这是gccbug.它将您的lambda解释如下:[](auto&&,...){}所以有一个参数,然后是C

c++ - void main() 有什么问题?

为什么一直不鼓励在C++中将入口点的返回类型设置为void,后来又被标准删除,被现代编译器禁止?为什么它被认为是不好的做法?现在,据我了解,C#和Java都允许入口点的返回类型为void即staticvoidmain(String[]args)/*Java*/staticvoidMain(string[]args)/*C#*/C#和Java程序员并不认为这是不好的做法,事实上他们经常使用它。其他语言(仅打算成为,我怀疑C++至少在这十年内会成功)C++的可能继任者,如D编程语言或Vala也允许无效的主要()。如您所见,我怀疑C++社区将其从标准中删除,因为它太晦涩或不受欢迎。所以我的问

c++ - 为什么 void* 不是迭代器类型?

我用GCC4.8测试了以下代码,因为我们无法形成对void的引用,所以无法编译。#includeintmain(){std::iterator_traitstest;}这是否意味着void*不是iterator?(这里指的是概念)编辑:好的,问题不成立。我实际上要问的是为什么C++需要这样的void*行为?是出于安全考虑,即防止人们写坏东西吗?因为引用void是非法的,所以指针算术是:intmain(){std::uint8_ttest[]={1,2,3};void*wut=test;std::uint8_t*p2=static_cast(wut+1);std::cout(*p2)因此

c++ - 在 void 指针上使用 new

intmain(){void*Foo=new???deleteFoo;}你是怎么做类似上述的事情的?你不能放newvoid[size]。而且我不想知道如何使用malloc()和free()来做到这一点。我已经知道这行得通。我很好奇,想知道new和delete是怎么做的。我在谷歌上搜索了一下,看到了一些关于operatornew(size);和operatordelete(size);这些和new/delete有什么区别?为什么C++不仅仅允许newvoid*[size]? 最佳答案 这样就可以了:intmain(){void*Foo