c++26新功能—匿名占位符变量

一、占位符

占位符是什么?就是图书馆里桌子上的书本或眼镜,就是早先农村放电影时地上的砖头和小板凳。占位的意思是提示别人,此地有主了,你们看清楚,不要再来占了。但问题是,不管是小板凳还是书本总得有个东西往那儿放着,有点麻烦。能不能一种更简单的方法,只是声明一下就可以了,不用再特地找个东西去证明。
同样,在C++中也有类似的占位符,但都得用一个标记来标记一下(比如C++11提供了std::placeholders),那是不是也可以不用这个标记,而只是声明它是一个标记即可啊?嗯,C++26就提供了优雅匿名占位符,或者更严格的说优雅匿名占位符变量。
在早期的C++中可以使用只声明类型,不声明变量来实现匿名变量:

void test(int a,int/*省略变量名*/)

在C++17中则引入了[[maybe_unused]] 属性,如:

[[maybe_unused]] auto ret = mytest();

在C++20中则出现了相对与其它语言统一的匿名占位符:

auto [_,a] = std::make_pair(1,2);

不过,需要注意的单下划线并不是标准中的关键字。

二、优雅的匿名占位符变量

而在C++26中,前期使用了下面的方式:

auto [__,a] = getData();

但在最新的草案中,则使用了更优雅的方式,或者说兼容C++20中的方式,即直接使用一个下划线来实现匿名占位符变量。在C++26中,匿名占位符变量的特点在于:
1、无作用域冲突,可以连续使用,编译器不再报重复定义 的错误

auto [_,_,a] = getData();

2、更好的支持编译优化,编译器遇到此咱匿名变量时会直接优化掉它们
3、完全标准化,这个非常重要(上面提到了_单下划线之前是非标准的)

需要说明的一点是,对于模板中的匿名占位符还有一些限制,比如下面的将不会被支持:

template <auto _, auto _>
void f();

三、例程

看一下草案中的相关代码:

namespace a {
auto _ = f(); // Ok, declare a variable "_"
auto _ = f(); // error: "_" is already defined in this namespace scope
}
void f() {
auto _ = 42; // Ok, declare a variable "_"
auto _ = 0; // Ok, re-declare a variable "_"
{
auto _ = 1; // Ok, shaddowing
assert( _ == 1 ); // Ok
}
assert( _ == 42 ); // ill-formed: Use of a redeclared placeholder variables
}
enum MmapBits {
Shared,
Private,
_,
_,
Fixed,
Rename,
//...
};

看得资料前后有些不同,所以大家还是以C++最终的标准为准。

四、总结

通过对提案的前后分析,可以看出其实在考虑新的应用形式的情况下,尽量保持与其它语言的行为一致性以及向以前标准保持一定的兼容性,是C++标准不得不考虑的前提。这也可以看出,一门传统的语言创新的艰难之处。
类比到每个开发者,不断的创新和学习应该是多么难啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值