C++17新特性(1) -- 结构化绑定初始化(Structured binding declaration)

本文介绍了C++17中的结构化绑定初始化特性,它允许从tuple-like对象中简洁地声明和初始化多个不同类型的变量。通过案例分析了包括绑定类型、绑定数据成员等使用场景,使得代码更加简洁且编译时推导类型,提高了可读性。
摘要由CSDN通过智能技术生成

1 Introduction

C++17语言上(语言特性,而不是标准库新特性)引入了一种结构化绑定的新特性,使用该特性可以利用auto同时声明多个不同类型的变量并即时从一个tuple-like对象得到赋值/初始化。
Structured binding不但可以使C++的代码更加简洁,而且似乎从语法上更贴近Python这种脚本语言了。另外,auto变量会在编译时推导出变量的类型,所以无需担心会有运行时效率的下降。而且,好像也并不会影响到编译效率,这一点尚未看到有实测。

2 Structured binding尝鲜

在C++17之前,如果要接收从函数返回的std::tuple对象,我们可以使用std::tie

std::set<S> mySet;

S value{
  42, "Test", 3.14};
std::set<S>::iterator iter;
bool inserted;

// unpacks the return val of insert into iter and inserted
std::tie(iter, inserted) = mySet.insert(value);

if (inserted)
    std::cout << "Value was inserted\n";

但是在C++17中,利用Structured binding特性,可以这样处理使得代码更精简

std::set<S> mySet;

S value{
  42, "Test", 3.14};
//use 'const auto' if necessary
auto [iter, inserted] = mySet.insert(value);

上述代码片段的完整代码为(传送门):

#include <iostream>
1. range-based for循环 range-based for循环是C++11引入的一种新的循环结构,它可以简化对容器和数组等数据结构的遍历。其语法形式如下: ``` for (declaration : range_expression) statement ``` 其中,declaration是一个变量声明,range_expression是一个表示要遍历的数据结构的表达式,statement是循环体中要执行的语句。 range_expression可以是任何具有begin()和end()成员函数的对象,包括STL容器、原生数组、指针等。循环的过程中,declaration将会被自动初始化为range_expression中的每个元素,从而实现遍历。 2. 结构化绑定structured bindings) 结构化绑定C++17引入的一种新的语言特性,它可以将一个复杂的数据结构拆分成若干个变量,使得代码更加简洁易读。其语法形式如下: ``` auto [var1, var2, ...] = expression; ``` 其中,var1、var2等表示要绑定的变量名,expression表示要进行拆分的数据结构。 结构化绑定可以用在任何支持解包的上下文中,例如函数返回值、for循环中的迭代器等。 3. 引用折叠(reference collapsing) 引用折叠是C++11引入的一种语言特性,用于规定C++中引用类型的组合方式。其规则如下: - 对于右值引用(Rvalue Reference,T&&),无论与左值引用还是右值引用相结合,都会得到右值引用类型。 - 对于左值引用(Lvalue Reference,T&),在不使用模板特化的情况下,左值引用与左值引用相结合得到左值引用,右值引用与左值引用结合得到右值引用类型。 - 在使用模板特化的情况下,引用折叠规则会发生变化。 引用折叠的主要作用是简化模板编程中的引用类型推导。它也是许多新特性的基础,例如完美转发、可变参数模板等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值