草庐IT

c++ - 为什么 `boost::any` 比 `void*` 好?

boost::any和boost::any_cast与使用void*和dynamic_cast相比有哪些内在优势>? 最佳答案 优点是boost::any比void*更安全。例如inti=5;void*p=&i;static_cast(p);//Compilerdoesn'tcomplain.UndefinedBehavior.boost::anya;a=i;boost::any_cast(a);//throws,whichisgood至于您的评论,您不能从void*中dynamic_cast。您可以dynamic_cast仅从具有

c++ - 如果 void() 不返回值,我们为什么要使用它?

voidf()意味着f什么也不返回。如果void什么都不返回,那我们为什么要使用它呢?void的主要用途是什么? 最佳答案 当C被发明时,约定是,如果你没有指定返回类型,编译器会自动推断你想要返回一个int(对于参数也是如此)。但通常你编写的函数可以做一些事情并且不需要返回任何东西(例如,想想一个只在屏幕上打印一些东西的函数);出于这个原因,决定,要指定你根本不想返回任何东西,你必须使用void关键字作为“返回类型”。请记住,void还有其他用途;特别是:如果将其指定为函数的参数列表,则表示该函数不带参数;这在C中是必需的,因为没有

main() 的 C++ void 返回类型

一些C++编译器允许主函数具有返回类型void。但是操作系统不要求返回int类型值来指定程序是否正常结束吗? 最佳答案 C++not允许main具有void返回类型。已发布的C++标准要求它是int。一些C++编译器允许您使用void,但不建议这样做。一般来说,操作系统并不关心一种或另一种方式。特定的操作系统可能需要程序提供返回值,但它不一定来自main的返回值。如果C++编译器允许void,那么它可能会提供一些其他方法来指定程序的退出代码。 关于main()的C++void返回类型,我

#define 中的 C++ void 强制转换和运算符逗号

我在阅读一些源代码时发现了这一点。#defineMACRO(x)if((void)0,(x));elsesome_func();我不完全理解运算符逗号和void强制转换背后的原因。这可能与宏保护有关,我知道(void)0有时用于保护宏中的级联else,例如if(...)然后foo();else(void)0.关于为什么存在运算符逗号的任何想法?编辑:我开始认为这与owl有关(0,0). 最佳答案 我猜这个技巧是用来防止用户在if条件中声明变量的。你可能知道,在C++中这样做是合法的if(inti=some_func()){//you

c++ - void* 与 static_cast 对比 intptr_t 与 reinterpret_cast

我想知道两种不同类型的非常特殊类型的转换表之间是否存在特定的、基于标准的差异。特别是,给定:类型T和变量T*object是:intptr_topaque=reinterpret_cast(object);T*result=reinterpret_cast(opaque);相当于:void*opaque=static_cast(object);T*result=static_cast(opaque);我只关心result,它是否保证是相同的值,相当于任何类型T的原始object?我不在乎中间opaque有什么位模式,因为我相信标准技术上允许它们在每种情况下都不同(尽管没有理智的编译器会产

c++ - void main的由来是什么?

我经常在论坛周围看到臭名昭著的voidmain()并且几乎立即在问题后发表评论告诉用户永远不要使用voidmain()(我完全同意)。但是voidmain()的来源在哪里呢?为什么我仍然看到新人养成了让main不返回任何内容的坏习惯,而正确的方法是返回int。我明白为什么这种方法是错误的,如this中所述。问题和许多其他人,但我不知道这种声明main的方法是如何产生的,甚至不知道为什么它仍然教给一些学生。 最佳答案 甚至BjarneStroustrup也用C++编写了voidmain,因此它确实是一种常见的反模因,并且是一种旧的反模

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