草庐IT

c++ - 我可以在布局兼容的标准布局类型之间合法地重新解释_cast 吗?

我正在写一个类,假设答案是Areenumerationtypeslayoutcompatiblewiththeirunderlyingtype?是"is",是布局兼容的structkevent但使用enumclasses用于filter、flags等.为相关领域提供适当的基础类型。它也是标准布局(字段都是private并且它们本身都是标准布局,没有virtual成员,没有基类)。根据我对n3690的阅读,我可以确定我的类和structkevent具有相同的值表示,但我在标准中看不到任何允许我这样做的内容reinterpret_cast在它们之间,尽管这似乎是对“值表示”的合理解释。这在

c++ - 修改 Duff 设备的语法 - 这是合法的 C/C++ 吗?

直到昨晚我才遇到好奇Duff'sdevice首次。我一直在阅读它,我认为理解它并不难。我很好奇的是奇怪的语法(来自维基百科):registershort*to,*from;registerintcount;{registerintn=(count+7)/8;switch(count%8){case0:do{*to=*from++;case7:*to=*from++;case6:*to=*from++;case5:*to=*from++;case4:*to=*from++;case3:*to=*from++;case2:*to=*from++;case1:*to=*from++;}whi

c++ - 将可变类型列表的扩展打包到复杂类型的初始化列表中——这合法吗?

我想将可变类型列表“具体化”到相关值的initializer_list中。例如,有一个std::tuple几个std::integral_constant得到一个std::initializer_list{...}.在一般情况下,我想获得一些复杂类型的initializer_list,比如std::string.但是下面这个简单的例子让我在用Clang编译时崩溃了(尽管它适用于GCC,至少在Coliru上是这样),所以我怀疑是UB(或Clang中的错误):templatestd::initializer_listmaterialize(){return{std::to_string(T

c++ - Valgrind 合法的 "possibly lost"字节示例

我看到valgrind将内存泄漏分为:绝对迷路了间接丢失可能丢失了仍然可以联系到压制我刚刚修复了一个漏洞,其中“可能丢失”是主要问题。documentationsays:"possiblylost意味着你的程序正在泄漏内存,除非你用指针做一些不寻常的事情,这些指针可能会导致它们指向已分配block的中间;请参阅用户手册了解一些可能的原因"我可以知道一个“用指针做不寻常的事情,可能导致它们指向已分配block的中间”的例子吗?我的意思是一个例子,尽管它是由valgrind报告的,但可以忽略“可能丢失”。一个使用指针使valgrind提示但同时以这种方式使用指针在某种程度上是合法的示例谢谢

c++ - 为什么这两个函数指针在 C/C++ 中都是合法的?

我有这两个测试函数:intapply_a(int(*fun)(int,int),intm,intn){return(*fun)(m,n);}intapply_b(int(*fun)(int,int),intm,intn){returnfun(m,n);}它们似乎返回了不同的东西,那么为什么它们都产生相同的结果呢?intadd(inta,intb){returna+b;}intres_a=apply_a(add,2,3);//returns5intres_b=apply_b(add,2,3);//returns5我会假设其中之一会返回指针地址或指针本身;而不是存储在指针上的值...那么它

c++ - #endif 之后的代币合法吗?

我目前执行以下操作,编译器(MSVC2008/以及2010)没有提示,但我不确定这是否是个坏主意:#ifndefFOO_H_#defineFOO_H_//note,FOO_H_isnotacomment:#endifFOO_H_我以前总是把它写成#endif//FOO_H_但我发现自己今天没有这样做,觉得这很奇怪,因为显然我已经有一段时间没有使用评论方法了。我应该回头查看所有header并进行修复(这是一个跨平台应用程序)是一种不好的做法,还是可以保持原样? 最佳答案 严格来说(根据标准中的语法)在同一行的#endif指令之后不允许

c++ - C/C++ 中 offsetof 宏的合法使用

有这个宏offsetof在C/C++中,它允许您获取POD结构中成员的地址偏移量。来自CFAQ的示例:structfoo{inta;intb;};structfoo;/*Setthebmemberoffooindirectly*/*(int*)((char*)foo+offsetof(b))=0xDEADBEEF;现在这对我来说似乎很邪恶,我看不到这个宏的许多合法用途。我见过的一个合法示例是它在container_of中的使用Linux内核中用于获取嵌入式结构父对象地址的宏:/*gettheaddressofthecmosdevicestructinwhichthecdevstruct

c++ - 声明但不定义内部结构/类——C++ 是否合法?

以下代码是否合法C++?classFoo{classBar;voidHaveADrink(Bar&bar);voidPayForDrinks(Bar&bar);public:voidVisitABar(intdrinks);};classFoo::Bar{public:intcountDrinks;};voidFoo::HaveADrink(Bar&bar){bar.countDrinks++;}voidFoo::PayForDrinks(Bar&bar){bar.countDrinks=0;}voidFoo::VisitABar(intdrinks){Barbar;for(inti=

c++ - 在同一个线程的同一个实例上多次调用 shared_future::get() 是否合法?

我找不到关于此事的直接确认或反驳。所有答案似乎都解决了“从多线程访问”方面的问题,而不是重复访问本身。标准是否定义了std::shared_future的行为?boost::shared_future怎么样? 最佳答案 根据std::shared_future::valid中的cppreferenceUnlikestd::future,std::shared_future'ssharedstateisnotinvalidatedwhenget()iscalled.这是有道理的。如果不是这种情况,那么您将无法让多个线程调用get。.我

c++ - 超越结构的一个元素以查看另一个元素是否合法?

给出以下人为设计的示例代码:structabc{intx[5];inty[5];};voidmain(){structabctest;test.y[0]=10;printf("%n",test.x[5]);}程序的输出是10。虽然这不是最佳编程实践,但确实有效。然而,这是编译器和平台的产物,还是合法代码?(即由C标准定义?)即使不能保证结果为10,是否存在这样的“非法”实例(即写入我不“拥有”的内存)? 最佳答案 不,它既不合法也不保证有效。编译器可以将填充添加到结构中,以帮助对齐,具体取决于体系结构等。编辑:总结这些评论中的一些内