以const指针传递临时对象替代const引用:此变通方案是否合规?
临时对象指针传递的合法性与解决方案
一、你的程序完全符合C++标准
C++标准确实禁止直接获取临时对象的地址(&std::string("Hello, world")属于非法写法,因为临时对象是右值,不能通过&运算符直接取址),但当临时对象绑定到const左值引用时,其生命周期会被延长至该引用所在的完整表达式结束。
在你的代码中,std::string("Hello, world")这个临时对象绑定到constRefToPtr的参数v,而整个调用表达式takeStringPtr(constRefToPtr(...))是一个完整表达式——临时对象会存活到这个表达式执行完毕。也就是说,在takeStringPtr函数内部解引用指针时,临时对象依然存在,行为完全合法且安全。
二、标准库没有现成的此类辅助工具
C++标准库并未提供专门用于将临时对象的const引用转换为指针的工具,这类场景相对小众。不过你自己实现的constRefToPtr已经足够实用,还可以泛化为模板以支持任意类型:
template<typename T> const T* constRefToPtr(const T& v) { return &v; }
三、针对你的场景的替代方案
你提到函数使用const指针是为了支持nullptr,同时希望兼容临时对象,这个需求很合理。除了辅助函数的方式,还可以给函数重载一个接受const引用的版本:
void takeStringPtr(const std::string* s) { if (s) { std::cout << *s << std::endl; } } void takeStringPtr(const std::string& s) { takeStringPtr(&s); }
这样调用时既可以传递nullptr,也能直接传入临时对象,无需额外的转换函数,可读性更强。
内容的提问来源于stack exchange,提问作者dragonroot
相关产品推荐
相关产品推荐

