草庐IT

weak_ptr_cast

全部标签

c++ - reinterpret_cast 奇怪(逗号分隔的表达式)

在调试我们的一些代码(C++)时,我发现了这个:inlinestd::stringBufferToStr(constunsignedchar*buffer,intindex,size_tlength){std::stringretValue(reinterpret_cast(&buffer[index],length));returnretValue;}这段代码的问题(忽略了缺少指针和字符串长度检查)是reinterpret_cast的右括号被放在length之后,而它应该有在&buffer[index]之后。起初我认为这是编译器的问题(使用VS2013),但在使用VS2012和gcc

c++ - 为什么 C 风格的类型转换可以工作,但 reinterpret_cast 不能?

所以我有一个两个字符数组unsignedcharv[2];我想将v[0]的值显示为0到255之间的数字,但是cout所以我尝试了cout或printf("%d\n",v[0]);这正是我想要的,但我一点也不喜欢。另外我完全不明白为什么这不起作用:cout(v[0]) 最佳答案 (通俗地说)reinterpret_cast用于以实现定义的方式将对象的位解释为另一种类型。您不希望这样:您想要转换(从char到int)。请改用static_cast。(reinterpret_cast的所有可能用途都列在5.2.10中;这不是其中之一。)

c++ - ptr->hello();/* VERSUS */(*ptr).hello();

我正在学习C++指针,而->运算符对我来说似乎很奇怪。代替ptr->hello();可以写成(*ptr).hello();因为它似乎也可以工作,所以我认为前者只是更方便方式。是这样还是有什么不同? 最佳答案 ->运算符只是语法糖,因为(*ptr).hello()是要键入的PITA。就在ASM级别生成的指令而言,没有区别。事实上,在某些语言中(想到D),编译器会根据类型计算出所有内容。如果你使用ptr.hello(),它就可以工作,因为编译器知道ptr是一个指针并且没有hello()属性,所以你的意思是(*ptr).hello().

c++ - 为什么提议的 `std::shared_ptr::operator[]` 以 `std::ptrdiff_t` 作为参数

AccordingtotheN4562proposal,thenewlyproposedstd::shared_ptr::operator[]takesinstd::ptrdiff_t,whichisasignedtype.这与标准库中的每个索引运算符都不一致。甚至std::unique_ptr::operator[]也需要std::size_t。做出这个决定的理由是什么? 最佳答案 大概这应该是指针接口(interface)的统一吧。用作数组时,好的ol'C指针接受负索引:p[-2]与*(p-2)相同;并且ptrdiff_t因此自

c++ - 是否预计 boost::thread_specific_ptr<>::get() 的使用会很慢?有什么解决办法吗?

我目前正在使用Valgrind的“Callgrind”分析一个存在性能问题的应用程序。在查看分析数据时,似乎有25%的处理时间花在boost::detail::get_tss_data的应用程序中,其主要目的是物理模拟和可视化。get_tss_data显然是由thread_specific_ptr::get调用的有人认为这是预期的吗?它通常是否暗示其他特定的东西?编辑:我的平台是:Linux-2.6.32、x86、GCC4.4.3、libc6-2.11.1/libpthread-2.11.1 最佳答案 thread_specific

c++ - reinterpret_cast、char* 和未定义的行为

reinterpret_castingachar*(或char[N])在哪些情况下是未定义行为,何时定义行为?我应该使用什么经验法则来回答这个问题?我们从thisquestion了解到,以下是未定义的行为:alignas(int)chardata[sizeof(int)];int*myInt=new(data)int;//OK*myInt=34;//OKinti=*reinterpret_cast(data);//但是在什么时候我们可以对char数组执行reinterpret_cast并且让它不是未定义的行为?下面是几个简单的例子:没有new,只有reinterpret_cast:al

c++ - boost shared_ptr 取消引用成本

我正在尝试比较原始指针、boostshared_ptr和boostweak_ptr之间的性能。在取消引用部分,我预计shared_ptr和raw_ptr相等,但结果显示shared_ptr的速度大约是原来的两倍。对于测试,我正在创建一个带有指向int的指针或共享指针的数组,然后在这样的循环中取消引用:intresult;for(inti=0;i!=100;++i){for(inti=0;i!=SIZE;++i)result+=*array[i];}测试的完整代码可以在这里找到:https://github.com/coolfluid/coolfluid3/blob/master/tes

c++ - 从类方法返回成员 unique_ptr

我正在尝试将std::unique_ptr类成员(尝试移动所有权)返回给调用者。以下是示例代码片段:classA{public:A():p{newint{10}}{}staticstd::unique_ptrFoo(A&a){returna.p;//ERROR:Copyconstructorgettinginvoked//returnstd::move(a.p);WORKSFINE}std::unique_ptrp;};我认为编译器(gcc-5.2.1)在这种情况下能够进行返回值优化(复制省略),而不需要通过std::move()明确意图。但事实并非如此。为什么不呢?以下代码似乎可以正

C++20 bit_cast 与 reinterpret_cast

根据ISOC++委员会的最后一次session,bit-cast将在C++20标准中引入。我知道reinterpret_cast不适合这份工作,因为typealiasingrules但我的问题是,为什么他们选择不扩展reinterpret_cast以将对象视为位序列表示,而更愿意将此功能作为一种新的语言结构提供? 最佳答案 嗯,有一个明显的原因:因为它不会做bit_cast所做的所有事情。即使在我们可以在编译时分配内存的C++20世界中,reinterpret_cast也被禁止在constexpr函数中使用。bit_cast的明确目

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: