能否在C++结构化绑定中分别指定变量为const和非const?
结构化绑定拆分std::pair为非const和const变量的正确方式
你给出的示例代码无法实现需求:
std::pair<int, int> anExamplePair = std::make_pair(1, 2); auto [nonConstVariable, constVariable] = anExamplePair;
这里的auto会推导整个结构化绑定的拷贝类型,两个变量都是非const的int——变量名里的constVariable只是命名,不具备实际的const属性,你依然可以修改它的值。
可行的实现方式
要拆分出一个可修改的非const变量和一个不可修改的const变量,有两种常用写法:
方法1:结合引用与const修饰
直接通过引用绑定原pair的元素,给第二个元素加上const引用限定:
std::pair<int, int> anExamplePair = {1, 2}; auto& nonConstVar = anExamplePair.first; const auto& constVar = anExamplePair.second;
这种写法直观易懂,是实际开发中最常用的方式。
方法2:用std::ref/std::cref包装元素
通过std::ref和std::cref分别包装原pair的两个元素,生成新的pair后再做结构化绑定:
#include <functional> // 需要包含此头文件 std::pair<int, int> anExamplePair = {1, 2}; auto [nonConstVar, constVar] = std::make_pair(std::ref(anExamplePair.first), std::cref(anExamplePair.second));
此时nonConstVar是int&类型,可直接修改原pair的first元素;constVar是const int&类型,无法修改原pair的second元素。
结论
结构化绑定并非必须将所有变量同时设为const或非const,只要通过引用或包装器的方式,就能为每个拆分出的元素单独指定const属性,这种做法是合理且符合C++标准的。
内容的提问来源于stack exchange,提问作者HarryP2023
相关产品推荐
相关产品推荐

