C++自動類型推導 : auto 與 decltype 用法

基本用法與區別

auto 總是推導出“值類型”,絕不會是“引用”,如果有引用,auto會把引用去掉,推導出值類型; auto 可以附加上 const、volatile、*、& 這樣的類型修飾符,得到新的類型。

auto x = 10L; // auto推導為long,x是long
auto& x1 = x; // auto推導為long,x1是long&
auto* x2 = &x; // auto推導為long,x2是long*
const auto& x3 = x; // auto推導為long,x3是const long&
auto x4 = &x3; // auto推導為const long*,x4是const long*

auto 只能用于“初始化 “, “自動類型推導”要求必須從表達式推導,那在沒有表達式的時候

就需要使用decltype + 表達式,自己解決類型推導問題。

decltype 的形式很像函數,后面的圓括號里就是可用于計算類型的表達式(和 sizeof 有點 類似),其他方面就和 auto 一樣了,也能加上 const、*、& 來修飾 ,它是用來直接聲明變量的。

int x = 0; // 整型變量
decltype(x) x1; // 推導為int,x1是int
decltype(x)& x2 = x; // 推導為int,x2是int&,引用必須賦值
decltype(x)* x3; // 推導為int,x3是int*
decltype(&x) x4; // 推導為int*,x4是int*
decltype(&x)* x5; // 推導為int*,x5是int**
decltype(x2) x6 = x2; // 推導為int&,x6是int&,引用必須賦值

decltype 不僅能夠推導出值類型,還能夠推導出引用類型,也就是表達式的“原始類 型”。

delctype的缺點是 是寫起來略麻煩,特別在用于初始化的時候,表達式要重復兩次 (左邊的類型計算,右邊的初始化)

當decltype(auto)被用于聲明變量時,該變量必須立即初始化。假設該變量的初始化表達式為e,那么該變量的類型將被推導為decltype(e)。也就是說在推導變量類型時,先用初始化表達式替換decltype(auto)當中的auto,然后再根據decltype的語法規則來確定變量的類型。

int x = 0; // 整型變量
decltype(auto) x2 = &x; // 推導為int*
decltype(auto) x3 = x1; // 推導為int&

常見用法

auto的 range-based for 用法

不需要關心容器元素類型、迭 代器返回值和首末位置,就能非常輕松地完成遍歷操作

vector<int> v = {2,3,5,7,11}; // vector順序容器
for(const auto& i : v) { // 常引用方式訪問元素,避免拷貝代價cout << i << ","; // 常引用不會改變元素的值
}
for(auto& i : v) { // 引用方式訪問元素i++; // 可以改變元素的值cout << i << ",";
}

decltype 簡化函數指針

// UNIX信號函數的原型,看著就讓人暈
void (*signal(int signo, void (*func)(int)))(int)
// 使用decltype可以輕松得到函數指針類型
using sig_func_ptr_t = decltype(&signal) ;

decltype在類內部實現參數推導

在定義類的時候,auto 被禁用了。可以用decltype獲取表達式類型,配合using生成別名

class DemoClass final {
public:using set_type = std::set<int>; // 集合類型別名
private:set_type m_set; // 使用別名定義成員變量// 使用decltype計算表達式的類型,定義別名using iter_type = decltype(m_set.begin());iter_type m_pos; // 類型別名定義成員變量
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376879.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376879.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376879.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++智能指針使用指南 part1:基本使用

加粗樣式>TOC 智能指針是代理模式的具體應用&#xff0c;它使用 RAII 技術代理了裸指針&#xff0c;能夠自動釋放內存&#xff0c; 無需程序員干預&#xff0c;所以被稱為“智能指針”。 智能指針不是指針&#xff0c;而是一個對象&#xff0c;所以不要對其調用delete&…

AS3.0 BitmapData類介紹

注&#xff1a;文中的Bitmapdata和BMD均為同一意思BitmapData,BMD為其縮寫一&#xff0c;概括&#xff1a; Bitmapdata繼承Object對象&#xff0c;實現IBitmapDrawable接口&#xff0c;這個接口有什么用&#xff0c;你可以理解為Drawable,能被畫。官方介紹是&#xff1a;IBitma…

C++使用JSON的序列化與反序列化

這里使用的json解析工具為JSON for Modern C,使用的話僅需要包含頭文件。 獲取方式&#xff1a;wget https://github.com/nlohmann/json/releases/download/v3.7.3/json.hpp JSON json的序列化功能和map一樣&#xff0c;用關聯數組的"[]"來任意添加數據&#xff0c…

iOS判斷為空或者只為空格

本文轉載至 &#xff1a;http://www.cnblogs.com/superhappy/archive/2012/11/08/2761403.html 經常有需求 要判斷不能為空&#xff0c;后臺老是鄙視不做非空判斷的前端 &#xff0c;木辦法 只能寫一個。 第一種想法&#xff1a;我不就是判斷 是不是nil就可以了么。結果發現太天…

Hyper-V

Hyper-V&#xff1a;也就是虛擬化技術&#xff0c;允許終端用戶在同一臺機器上運行多個操作系統&#xff0c;支持32位和64位系統&#xff0c;可以直接在Windows 8上創建自己的虛擬機。開啟Hyper-V虛擬機需要更多的內存&#xff0c;正常運行需要至少4GB以上內存&#xff0c;所以…

sdut 1451 括號東東 DP

http://acm.sdut.edu.cn/sdutoj/problem.php?actionshowproblem&problemid1451 題意&#xff1a;中文..... 思路&#xff1a; pku有一道題&#xff0c;經典的括號匹配&#xff08;區間DP&#xff09;題目&#xff0c;那道題目是求的最長滿足條件的子串的長度&#xff0c;那…

CDN緩存替代算法

CDN緩存工作過程如下&#xff1a;用戶發出一個請求&#xff0c;如果請求被命中&#xff0c;緩存將對用戶的請求進行響應&#xff0c;返回其請求的數據&#xff1b;如果未被命中&#xff0c;緩存向上拉取用戶需要的數據&#xff0c;并對其存儲的數據進行替換。 緩存算法的意義在…

前端開發常用正則表達式

1、電話 var phone /(^[^1][0-9\-]{6,20}$)|(^(134|135|136|137|138|139|150|151|152|157|158|159|182|183|187|188|147|130|131|132|155|156|185|186|145|133|153|180|189|181|184)\d{8}$)/ 2、郵箱 var email /^([a-zA-Z0-9_.-])([a-zA-Z0-9_-])((\.[a-zA-Z0-9_-]{2,3}){1,…

android 中調用接口發送短信

轉載&#xff1a;http://ziyu-1.iteye.com/blog/1013932 android中可以通過兩種方式發送短信 第一&#xff1a;調用系統短信接口直接發送短信&#xff1b;主要代碼如下&#xff1a; Java代碼//直接調用短信接口發短信 SmsManager smsManager SmsManager.getDefault(); List…

linux 命令案例學習——文件搜索

兩個搜索文件的工具 locate ——僅僅通過文件名查找文件find ——依據文件的各種屬性在既定目錄&#xff08;包括子目錄&#xff09;里查找一個通常與文件搜索命令一起使用、處理搜索結果文件列表的命令 xargs1 locate 1.1 查找文件名中含有zip的文件名 locate zip 看下結…

Redis 緩存擊穿、緩存穿透、緩存雪崩的處理方法

常用的分布式緩存Redis單機并發量能達到萬級&#xff0c;常用的關系型數據庫MySQL一般并發量是千級&#xff0c;他們支持的并發量可能差十倍&#xff0c;所以要盡可能把流量攔截在緩存層。 緩存擊穿 一個并發訪問量比較大的key在某個時間過期&#xff0c;導致所有的請求直接打…

Java-- 異常與記錄日志

可以使用java.util.logging工具將輸出記錄在日志中。記錄日志的的功能還是很簡單的&#xff0c;下面直接鋪出代碼&#xff1a; 1 package com.exceptions;2 3 import java.io.*;4 import java.util.logging.Logger;5 6 class LoggingException extends Exception{7 private…

圖像處理基礎

圖像處理基礎 在計算機中&#xff0c;按照顏色和灰度的多少可以將圖像分為二值圖像、灰度圖像、索引圖像和真彩色RGB圖像四種基本類型。目前&#xff0c;大多數圖像處理軟件都支持這四種類型的圖像。 (1) 二值圖像&#xff1a;一幅二值圖像的二維矩陣僅由0、1兩個值構成&#x…

緩存一致性解決方法

對于緩存 數據庫讀寫&#xff0c;有個經典的Cache Aside Pattern&#xff1a; 讀取&#xff1a;先讀取緩存&#xff0c;緩存里沒有&#xff0c;讀取數據庫&#xff0c;然后返回響應&#xff0c;順便保存緩存&#xff1a; 更新&#xff1a;先更新數據庫&#xff0c;然后刪除緩…

使用SpringMVC的表單驗證

上一篇搭建了基本項目&#xff0c;這一篇在此基礎上加入表單驗證功能。 第一步&#xff0c;添加command類 Java代碼 package test.bean; import javax.validation.constraints.Size; public class User { Size(min3,max30) private String username; …

hdu1247(Hat’s Words)

我以為像a、aa這樣的輸入應該是沒有輸出的&#xff0c;結果還是要輸出aa。 建樹的時候就是常規建樹&#xff0c;不過查找的時候要做一些變形&#xff1a;對于一個單詞&#xff0c;從第一位檢查有沒有單詞是它的前綴&#xff0c;如果有的話&#xff0c;再去檢查它的后半部分是不…

單體、分布式、微服務、Serverless軟件架構一覽

目錄軟件架構單體架構分布式應用微服務架構Serverless架構總結Reference軟件架構 軟件架構就是軟件的基本結構&#xff0c;合適的架構是軟件成功的最重要因素之一。這里列舉了目前流行的4種軟件架構。 單體架構 典型的三級架構&#xff1a;前端&#xff08;web/手機端&#…

MyBatis3 association error - The content of element type resultMap must match (constructor?,id*,r...

MyBatis3 association error - The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)" 1.后臺錯誤信息-問題現象&#xff1a; ERROR [geby:Context initialization failed] 2013-0…

Midjourney V6刷屏,但它最可怕的地方居然不是那些神圖?

Midjourney在沉寂九個月后推出了Midjourney V6&#xff0c;這個文生圖產品體現出的更細膩的細節處理&#xff0c;更強大的語言理解能力和更加“不像AI”的圖片效果在過去幾天引發一片驚呼。 作為一個閉源的模型產品&#xff0c;Midjourney的魔法配方并不為人所知&#xff0c;但…

HTTP 錯誤500.19 -Internal Server Error

HTTP 錯誤500.19 -Internal Server Error 原文:HTTP 錯誤500.19 -Internal Server Error HTTP 錯誤500.19 -Internal Server Error 錯誤代碼 0x80070021 asp.net 2009-11-05 16:54:33 閱讀484 評論1 字號&#xff1a;大中小 錯誤摘要 HTTP 錯誤500.19 -Internal Server Error …