为何`auto self(shared_from_this());`可作变量声明且无需前置声明?
为什么
self无需前置声明就能作为变量声明?self只是一个普通变量名,不是C++关键字,这条语句本身就是变量的定义声明:- C++11引入的
auto关键字用于自动推导变量类型,编译器会根据shared_from_this()的返回值(std::shared_ptr<当前类>)确定self的具体类型。 - 局部变量的声明不需要前置声明,这条语句直接完成了
self的定义和初始化,自然不需要额外前置步骤。
- C++11引入的
两种写法
auto self(shared_from_this());和auto self = shared_from_this();为何等效?
这两种写法对应C++的两种初始化方式,最终效果完全一致:auto self(shared_from_this());是直接初始化,直接调用构造函数完成变量初始化;auto self = shared_from_this();是复制初始化,从C++17开始编译器会强制进行复制消除,跳过临时对象的创建,直接构造目标对象,和直接初始化的执行逻辑完全相同。
无论哪种方式,self最终都会成为指向当前对象的共享智能指针,功能上没有差异。
补充:这种写法的作用
在Boost ASIO的异步场景中,self会被后续的lambda表达式捕获,通过持有对象的shared_ptr维持对象生命周期,确保异步操作执行期间对象不会被提前销毁,避免悬空指针或未定义行为。
内容的提问来源于stack exchange,提问作者medihack
相关产品推荐
相关产品推荐

