C++17中使用含引用的std::pair是否合法且安全?
在C++17中使用带引用的std::pair是否安全?
你的用法完全合法,而且在C++17里是安全的,关于拷贝的判断也没错:
- 用
std::pair<T&, int>(t, 1)时,pair的第一个成员是T的左值引用,构造时只是把引用绑定到t上,不会触发T的拷贝构造函数;而std::pair<T, int>(t, 1)会把t拷贝到pair的第一个成员中,确实多一次拷贝操作。 - 安全性的核心和普通引用一样:只要在这个pair的整个生命周期内,被引用的对象
t一直处于有效状态,就不会有任何问题。如果t在pair之前被销毁,pair里的引用就会变成悬空引用,访问它会导致未定义行为——这是引用的通用规则,和pair本身无关。 - C++17标准完全支持将引用类型作为
std::pair的模板参数,其构造函数会正确处理引用绑定,不存在兼容性或未定义行为的隐患。
额外提一句:如果后续有需要把这类pair存入容器的场景,std::pair<std::reference_wrapper<T>, int>可能比直接用引用类型更灵活,但你的原始写法在C++17环境下完全没问题。
内容的提问来源于stack exchange,提问作者f1msch
相关产品推荐
相关产品推荐

