草庐IT

c++ - 在 C++ 中将指向对象的指针转换为 void *

我读过StackOverflow太多,开始怀疑我写过的所有代码,我一直在想“这是未定义的行为吗?”即使在已经运行了很长时间的代码中也是如此。所以我的问题-将指向对象(在本例中为抽象接口(interface)类)的指针转换为void*然后将它们转换回原始类并使用它们调用方法是否安全且定义明确?我完全清楚执行此操作的代码可能很糟糕。我什至不会考虑现在这样写(这是我真的不想更改的旧代码),所以我不是在寻找更好的方法来做这件事的讨论。如果我再次这样做,我已经知道如何写得更好。但是,如果在C++中依赖它确实被破坏了,那么我将不得不考虑更改代码,如果它只是糟糕的代码,那么更改它就不会是优先事项。一

c++ - 在没有参数的函数中使用void?

在C++中,在不带参数的函数中使用void,例如:classWinMessage{public:BOOLTranslate(void);};是多余的,你还不如写Translate();.我自己通常包含它,因为当支持代码完成的IDE显示void时它会有点帮助,因为它确保我的函数绝对不需要参数。我的问题是,将void添加到无参数函数是一种好习惯吗?在现代代码中应该鼓励它吗? 最佳答案 在C++中voidf(void);等同于:voidf();第一种样式仍然可以合法编写的事实可以归因于C。n3290§C.1.7(C++和ISOC兼容性)声

c++ - 为什么将 operator void*() 转换函数添加到 C++ 流类中?

C++流类中有一个转换函数operatorvoid*()const。以便所有流对象都可以隐式转换为void*。在与SO上的程序员互动期间,他们建议我不要使用void*,除非你有充分的理由使用它。void*是一种消除类型安全和错误检查的技术。因此,由于此转换函数的存在,以下程序是完全有效的。这是C++standardlibrary.中的一个缺陷。#includeintmain(){deletestd::cout;deletestd::cin;}观看现场演示here.上述程序在C++03中有效,但在C++11及更高版本的编译器中编译失败,因为此转换功能已被删除。但问题是,如果它很危险,为什

c++ - 对 'operator delete(void*)' 的 undefined reference

我是C++编程的新手,但从事C和Java方面的工作已经很长时间了。我正在尝试在我正在处理的一些串行协议(protocol)中做一个类似接口(interface)的层次结构,并不断收到错误:Undefinedreferenceto'operatordelete(void*)'(简化的)代码如下:PacketWriter.h:classPacketWriter{public:virtual~PacketWriter(){}virtualuint8_tnextByte()=0;}StringWriter.h:classStringWriter:publicPacketWriter{publi

c++ - `void f(A<0>, tuple<T *...>)` 不是比 `void f(A<I>, tuple<T *...>)` 更专业吗?

#includetemplatestructA{};templatevoidf(A,std::tuple){}templatevoidf(A,std::tuple){}intmain(){f(A{},std::tuple{});}不是f的第二次重载吗?更专业?g++4.9.2表示调用不明确,clang3.6.0接受它。哪个编译器是对的?有趣的是,如果您更改std::tuple至std::tuple,g++就可以了,这个我没看懂。 最佳答案 根据当前规则,第二个重载更加特化。一些专业A具有合成值@无法与A匹配,但是A可以匹配A(与I=

c++ - void 作为文字类型?

在C++14中void是文字类型Atypeisaliteraltypeifitis:—void;or—ascalartype;or—areferencetype;or—anarrayofliteraltype;or—aclasstype(Clause9)thathasallofthefollowingproperties:—ithasatrivialdestructor,—itisanaggregatetype(8.5.1)orhasatleastoneconstexprconstructororconstructortemplatethatisnotacopyormoveconstr

c++ - argc 和 argv 的 void cast

我在看一段C++代码,main函数的第一行引起了我的注意:intmain(intargc,constchar*argv[]){(void)argc;(void)argv;...}除此行之外,根本不使用argc和argv。为什么作者要进行空投?是否可以阻止编译器提示未使用的变量? 最佳答案 “是否可以阻止编译器提示未使用的变量?”是的 关于c++-argc和argv的voidcast,我们在StackOverflow上找到一个类似的问题: https://sta

c++ - void(int) 和 void (*)(int) 之间的区别

我知道void(*)(int)是函数指针,但void(int)是什么?用于std::function模板。假设我有一个函数voidfun(int){}:decltype(&fun)给出void(*)(int)但是decltype(fun)给出void(int) 最佳答案 如果T是一个类型,那么T*表示类型“pointer-to-T”。类型void(int)是一个函数类型,它是一个函数的类型,一个int返回void。例如,如果f被声明为voidf(int);就是f的类型如果T=void(int),那么T*拼写为void(*)(int)

c++ - void* 可以用来存储函数指针吗?

这个问题在这里已经有了答案:WhyarefunctionpointersanddatapointersincompatibleinC/C++?(14个回答)关闭8年前。void*被定义为它可以指向任何东西。那么它可以用来指向一个函数(intsend())吗?intsend();void*p=send;有可能吗?当我这样使用时,它没有向我显示错误,为什么?如果没有,有没有办法将所有指针存储在一个变量中? 最佳答案 也许吧。在C++11之前,他们不能;但C++11增加了:Convertingafunctionpointertoanobj

c++ - 为什么不能在 C++ 中创建 void 类型的对象?

C++不允许创建void类型的对象。这是为什么呢? 最佳答案 考虑下面的代码。classFoo{//etc...};intmain(){//Declaringanobject...Foofoo;//foohasbeencreated.//etc...return0;//Whenfunctionreturns,foowillbedestroyed.}为了知道如何实际创建对象,编译器必须知道类型。非正式地,您可以将void视为表示没有类型的“类型”。因此,编译器不可能知道如何创建void对象。你不能创建一个你不知道如何创建的对象。int