C++ 17 as_const

C++ 17 as_const

std::as_const 的功能很简单:把一个对象转换成 const 引用。
它不会拷贝对象,也不会真的创建新对象,只是让你以 const 视角去看它。

1. 它是干什么用的?

有些对象既有 const 成员函数,也有非 const 成员函数。
如果当前变量本身不是 const,而你又想明确调用 const 版本,可以用 std::as_const

2. 基本示例

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <utility>
#include <vector>
#include <iostream>
using namespace std;

int main()
{
vector<int> nums{1, 2, 3};

const auto& ref = as_const(nums);
cout << ref.size() << endl;
return 0;
}

这里 ref 只是 nums 的 const 引用,不会发生拷贝。

3. 一个更典型的场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string>
#include <utility>
using namespace std;

class Demo
{
public:
string& get()
{
cout << "non-const version" << endl;
return value;
}

const string& get() const
{
cout << "const version" << endl;
return value;
}

private:
string value = "hello";
};

int main()
{
Demo d;
as_const(d).get();
return 0;
}

这时会调用 const 版本的 get()

4. 为什么不用手写 const 引用?

当然也可以这样写:

1
2
const Demo& cd = d;
cd.get();

std::as_const(d) 更短,也更明确表达了“这里只是临时想按 const 看它一下”。

5. 使用场景

5.1 调用 const 重载版本

这是最常见的场景。

5.2 避免误修改

有时只是想只读访问一个对象,用 as_const 能强化这个意图。

5.3 泛型代码里限制接口

在模板代码里,as_const 也能帮助你显式使用 const 语义。

6. 使用时要注意的点

6.1 它不会生成新对象

只是返回 const 引用,所以底层对象还是原来的那个。

6.2 不能拿它去修改对象

既然是 const 视角,那自然只能调用 const 接口。

6.3 移动对象不适合这样用

as_const 的目的就是“只读”,和移动语义的方向正好相反。

总结

std::as_const 虽然很小,但很实用。
它最常见的价值就是让你显式调用 const 版本接口,而不用额外写一份 const 引用变量。属于那种学起来几分钟、但日常写代码偶尔会很顺手的小工具。