草庐IT

non-void

全部标签

c++ - 为什么 'control reaches end of non-void function' 只是一个警告?合法吗?

这个问题在这里已经有了答案:WhydoesthisC++snippetcompile(non-voidfunctiondoesnotreturnavalue)[duplicate](7个答案)关闭8年前。C++定义具有非void返回类型的函数允许控制到达函数末尾而不是到达return语句是否合法?gcc和clang仅为此发出警告。这样做的代码是合法的还是这些编译器只是慷慨?海湾合作委员会:warning:noreturnstatementinfunctionreturningnon-void[-Wreturn-type]clang:warning:controlreachesendof

C++ API 设计 : is using void* a bad idea?

我正在开发一个我希望在调用方尽可能通用的API。主要设计思想是提供一种信号/插槽类型的实现,允许API的用户订阅一组给定的事件,并将用户定义的回调附加到它们。公共(public)界面看起来像这样:RetCallbacksubscribe(EventEnum&ev,std::functionfn)const;:注意void(void*)在这里签名。EventEnum在公共(public)头文件中给出,以及类型定义。然后,API的内部工作将通过通知方法将事件通知其订阅的观察者,并提供要转发给客户端的数据:voiddummyHeavyOperation()const{std::this_th

c++ - 我应该使用什么而不是 void 作为变体中的替代类型之一?

我想要一个变体,它可能包含Foo类型、(不相交的)Bar类型,或者什么都不包含。好吧,自然地,我在考虑使用std::variant-但这似乎不起作用。也就是说,您可以定义此类型,但如果您尝试实例化此类型,您将失败(GCC8.2)。那我该用什么呢?某种空结构? 最佳答案 您真正想要的是备选方案中的一种类型,它具有单个可能值-而不是void,它没有可能的值(并且在其他方​​面存在问题)。换句话说:Aunittype而不是bottomtype.标准库已定义为的一部分,此用例的“单元类型”:std::monostate(是的,它本质上是一个

c++ - 参数类型 void*& 是什么意思,有什么用?

我正在查看一个用C++编写的API,我对以下参数类型的含义感到困惑:无效*&数据这是否意味着用户将传递对空指针的引用?如果那是真的,那有什么意义呢?我的意思是void*已经是间接的,那么你为什么还要再次重定向它呢? 最佳答案 void*在C++中是pass-by-pointer的意思,意思是你传入一个指针,但实际上是指针的一个拷贝。如果你在你的函数中修改了这个指针,比如改变它的地址,它不会反射(reflect)在你传入的指针中。结合引用传递,void*&意味着您将原始指针的别名传递给此函数。如果你修改它,比如改变它的地址,它会反射(

c++ - 为什么 void 在 C++ 中不采用 void 值?

我很好奇为什么C++不通过:定义voidtypedefstruct{}void;即无法实例化的类型的值是什么,即使该安装必须不产生代码?如果我们使用gcc-O3-S,那么以下两个都会产生相同的汇编程序:intmain(){return0;}和templateTf(Ta){}typedefstruct{}moo;intmain(){mooa;f(a);return0;}这很有道理。struct{}只需要一个空值,很容易优化掉。事实上,奇怪的是它们在没有-O3的情况下生成不同的代码。但是,您不能简单地使用typedefvoidmoo来实现同样的技巧,因为void不能假定任何值,甚至不能是空

c++ - 如何解决模板参数推导中的 const/non-const 冲突

我有一个接受std::pair的函数模板以及其中一种类型的值。我想使用来自std::map的条目调用此函数作为对参数。#include#includetemplatevoiddo_stuff(std::pairconst&pair,T1const&val){//Imaginethatthisdoessomethingimportant...}intmain(){std::mapfoo{{0,0.0}};do_stuff(*foo.begin(),0);}编译失败,因为map条目的类型是std::pair,所以T1的类型推导有冲突的类型:constint通过pair参数,和int通过va

c++ - 理解 void* 对 intptr_t 和 uintptr_t

这是我正在测试的代码:intvalue=0;void*addyvoid=static_cast(&value);//C++-stylecast.它工作得很好,但我可以使用uintptr_t/intptr_t。但是正如人们所说的那样,它们并不适合用来指点here因为它们太大了。那么,这是真的吗?但是,如果是,使用void*保存指针会更好,但是会不会丢失数据? 最佳答案 intptr_t和uintptr_t的目的是,在某些应用程序中,您实际上确实需要对指针值进行某种数值计算,可能是通过翻转各个位,也许是XORing它们等。在这些情况下,

支持 Scott Meyer 建议的 C++ IDE : Prefer non-member non-friend functions over members

ScottMeyer关于非成员函数增加封装并允许更优雅的设计(设计方面)的论点对我来说似乎非常有效。看这里:Article但是我对此有疑问。(似乎还有其他人,尤其是库开发人员,他们通常完全忽略这一点)当我使用成员函数时,代码通常看起来更好、更合乎逻辑。不过,这可能是一种后天习得的品味,只是需要一些时间来习惯先查看算法,然后再查看对象。(颤抖)所以也许我只有一个问题:有了成员函数,我和我的IDE就知道类可以做什么。对我来说,这是巨大的!我使用任何不支持成员函数代码完成的东西来编程。在设计良好的库中,它完全取代了我的文档。即使我会查看api文档,浏览成员列表也感觉绝对自然、合乎逻辑,我可以

c++ - 为什么需要类型转换 (UINT)(void*)(DWORD)?

这个问题不太可能帮助任何future的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visitthehelpcenter.关闭9年前。这是MFC的CMap类中的默认HashKey函数。AFX_INLINEUINTAFXAPIHashKey(ARG_KEYkey){  //defaultidentityhash-worksformostprimitivevalues  return((UINT)(void*)(DWORD)key)>>4;}我的问题是为什么需要类型转换(DWORD)和(vo

c++ - C++ : why does free not accept a const void*, 中的 malloc/free 有更好的方法吗?

这个问题在这里已经有了答案:UnabletofreeconstpointersinC(12个答案)关闭8年前。将C++11代码连接到某些C回调,我必须传递constchar*const*,即字符串数组。这是我的代码的简化版本:intmain(int,char**){constintcnt=10;constchar*const*names=static_cast(malloc(sizeof(char*)*cnt));//...allocatingnames[0],etc.comingsoon...the_c_function(names);free(names);return0;}所以我