草庐IT

weak_ptr_cast

全部标签

c++ - 在将 void* 转换为任何内容时,我应该使用 static_cast 还是 reinterpret_cast

static_cast和reinterpret_cast似乎都可以很好地将void*转换为另一种指针类型。是否有充分的理由偏爱其中一个? 最佳答案 使用static_cast:它是准确描述此处进行的转换的最窄类型。有一种误解,认为使用reinterpret_cast会更好,因为这意味着“完全忽略类型安全,只是从A转换为B”。但是,这实际上并没有描述reinterpret_cast的效果。相反,reinterpret_cast有多种含义,所有含义都认为“reinterpret_cast执行的映射是实现定义的”。[5.2.10.3]但在

c++ - 使用成员函数作为自定义删除器与 std::shared_ptr 的问题

我正在尝试研究如何将std::shared_ptr与自定义删除器一起使用。具体来说,我将它与SDL_Surface一起使用:std::shared_ptr(SDL_LoadBMP(....),SDL_FreeSurface);编译和运行良好。但是,我想尝试自己的删除器,但不知道该怎么做。SDL_FreeSurface的文档可在此处找到:http://sdl.beuc.net/sdl.wiki/SDL_FreeSurface我在其中发现SDL_FreeSurface声明为:voidSDL_FreeSurface(SDL_Surface*surface);作为测试,根据该信息,我尝试了以下

c++ - 使用成员函数作为自定义删除器与 std::shared_ptr 的问题

我正在尝试研究如何将std::shared_ptr与自定义删除器一起使用。具体来说,我将它与SDL_Surface一起使用:std::shared_ptr(SDL_LoadBMP(....),SDL_FreeSurface);编译和运行良好。但是,我想尝试自己的删除器,但不知道该怎么做。SDL_FreeSurface的文档可在此处找到:http://sdl.beuc.net/sdl.wiki/SDL_FreeSurface我在其中发现SDL_FreeSurface声明为:voidSDL_FreeSurface(SDL_Surface*surface);作为测试,根据该信息,我尝试了以下

c++ - const_cast<> 的正确用法

一般来说,使用const_cast()通常被认为是一种不好的做法。在C++代码中,因为它(大多数时候)揭示了设计中的缺陷。虽然我完全同意这一点,但我想知道使用const_cast()的案例是什么?是ok和唯一的解决方案。你们能不能给我一些你知道/遇到的例子?非常感谢。 最佳答案 它几乎被设计为仅与不正确const的遗留API一起使用,即使用您无法更改的函数,该函数具有非const接口(interface),但实际上不会改变接口(interface)上的任何内容 关于c++-const_c

c++ - const_cast<> 的正确用法

一般来说,使用const_cast()通常被认为是一种不好的做法。在C++代码中,因为它(大多数时候)揭示了设计中的缺陷。虽然我完全同意这一点,但我想知道使用const_cast()的案例是什么?是ok和唯一的解决方案。你们能不能给我一些你知道/遇到的例子?非常感谢。 最佳答案 它几乎被设计为仅与不正确const的遗留API一起使用,即使用您无法更改的函数,该函数具有非const接口(interface),但实际上不会改变接口(interface)上的任何内容 关于c++-const_c

c++ - 为什么涉及虚拟继承时不能使用static_cast进行向下转换?

考虑以下代码:structBase{};structDerived:publicvirtualBase{};voidf(){Base*b=newDerived;Derived*d=static_cast(b);}这是标准禁止的([n3290:5.2.9/2])所以代码无法编译,因为Derived虚拟继承自Base。从继承中删除virtual使代码有效。此规则存在的技术原因是什么? 最佳答案 技术问题是无法解决Base*Base开头之间的偏移量是多少子对象和Derived的开始目的。在您的示例中,它看起来没问题,因为只看到一个带有Ba

c++ - 为什么涉及虚拟继承时不能使用static_cast进行向下转换?

考虑以下代码:structBase{};structDerived:publicvirtualBase{};voidf(){Base*b=newDerived;Derived*d=static_cast(b);}这是标准禁止的([n3290:5.2.9/2])所以代码无法编译,因为Derived虚拟继承自Base。从继承中删除virtual使代码有效。此规则存在的技术原因是什么? 最佳答案 技术问题是无法解决Base*Base开头之间的偏移量是多少子对象和Derived的开始目的。在您的示例中,它看起来没问题,因为只看到一个带有Ba

c++ - shared_from_this 导致 bad_weak_ptr

我正在尝试在asio中保留已连接客户端的列表。我已经从文档(http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/example/cpp03/chat/chat_server.cpp)中改编了聊天服务器示例,这是我最终得到的重要部分:#include#include#include#include#include#includeusingboost::asio::ip::tcp;classtcp_connection;std::set>clients;voidadd_client(boost::shared_ptrclient

c++ - shared_from_this 导致 bad_weak_ptr

我正在尝试在asio中保留已连接客户端的列表。我已经从文档(http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/example/cpp03/chat/chat_server.cpp)中改编了聊天服务器示例,这是我最终得到的重要部分:#include#include#include#include#include#includeusingboost::asio::ip::tcp;classtcp_connection;std::set>clients;voidadd_client(boost::shared_ptrclient

C++ std::unique_ptr:为什么 lambda 没有任何尺寸费用?

我正在阅读“有效的现代C++”。在std::unique_ptr相关的条目中声明如果自定义删除器是无状态对象,则不会产生大小费用,但如果它是函数指针或std::function尺寸费用发生。你能解释一下为什么吗?假设我们有以下代码:autodeleter_=[](int*p){doSth(p);deletep;};std::unique_ptrup(newint,deleter_);据我了解,unique_ptr应该有一个decltype(deleter_)类型的对象,并将deleter_分配给该内部对象。但显然这不是正在发生的事情。你能用尽可能小的代码示例解释这背后的机制吗?