草庐IT

void-compatibility

全部标签

c++ - 如何使用 std::shared_ptr<void> 和另一种类型的 std::shared_ptr 进行函数重载?

试试下面的代码:#include#includeclassC{public:voidF(std::function)>){}voidF(std::function)>){}};intmain(){Cc;c.F([](std::shared_ptr){});}你会看到一个编译错误:prog.cc:12:7:error:calltomemberfunction'F'isambiguousc.F([](std::shared_ptr){});~~^prog.cc:6:10:note:candidatefunctionvoidF(std::function)>){}^prog.cc:7:10:

c++ - 是否将两个 void 指针与 C++ 中定义的不同对象进行比较?

灵感来自thisanswer关于动态转换为void*:...booleqdc(B*b1,B*b2){returndynamic_cast(b1)==dynamic_cast(b2);}...intmain(){DD*dd=newDD();D1*d1=dynamic_cast(dd);D2*d2=dynamic_cast(dd);...eqdc(d1,d2)...我想知道它是否是C++中完全定义的行为(根据03或11标准)比较两个指向有效的(不)相等的void指针>,但不同的对象。更一般地说,但可能不那么相关,比较(==或!=)两个总是定义的void*类型的值,还是要求它们持有指向有效对

c++ - typedef void FOO 与 #define FOO void 在函数签名中的含义

这个问题在这里已经有了答案:void,VOID,CandC++(3个回答)关闭7年前。在浏览一些大量混合C和C++的源代码时,我遇到了以下内容(为了保护公司的工作,稍作修改,含义保持不变):/**TypedefsofvoidaresynonymouswiththevoidkeywordinC,*butnotinC++.InordertosupporttheuseofMY_VOID*inplaceofthevoidkeywordtospecifythatafunctiontakesno*arguments,itmustbeamacroratherthanatypedef.*/#defin

c++ - 如果使用 g++,为什么 std::cout 可以转换为 void*?

为什么可以将std::ostream转换为void指针?我不知道std::ostream中有任何此类转换运算符。代码如下#includeintmain(){void*p=std::cout;//whydoesthiswork?}我问这个问题是因为我看到一个放置操作符new被调用为Foo*pFoo=new(std::cerr)Foo;完全不知道为什么要写这样的东西。PS:我正在使用g++4.9.2进行编译,无论是否使用-std=c++11。clang++不接受代码。PSS:发现由于所谓的“安全bool问题”(参见@nicebyte的回答),在C++11之前,为std定义了一个void*转

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