中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中decltype怎么用

發布時間:2021-12-08 11:06:08 來源:億速云 閱讀:296 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關C++中decltype怎么用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

1.語法

decltype ( 實體 ) (1) (C++11 起)
decltype ( 表達式 ) (2) (C++11 起)

解釋:

1) 如果實參是沒有括號的標識表達式或沒有括號的類成員訪問表達式,那么 decltype 產生以該表達式命名的實體的類型。如果沒有這種實體或該實參指名了一組重載函數,那么程序非良構。

  • 如果實參是指名某個結構化綁定的沒有括號的標識表達式,那么 decltype 產生其被引用類型(在關于結構化綁定聲明的說明中有所描述)。

  • 如果實參是指名某個非類型模板形參的沒有括號的標識表達式,那么 decltype 生成該模板形參的類型(當該模板形參以占位符類型聲明時,類型會先進行任何所需的類型推導)。

2) 如果實參是其他類型為 T 的任何表達式,且

  • 如果 表達式 的值類別是亡值,將會 decltype 產生 T&&;

  • 如果 表達式 的值類別是左值,將會 decltype 產生 T&;

  • 如果 表達式 的值類別是純右值,將會 decltype 產生 T。

如果 表達式 是返回類類型純右值的函數調用,或是右操作數為這種函數調用的逗號表達式,那么不會對該純右值引入臨時量。

如果 表達式 是除了(可帶括號的)立即調用以外的 (C++20 起)純右值,那么不會從該純右值實質化臨時對象:即這種純右值沒有結果對象。

該類型不需要是完整類型或擁有可用的析構函數,而且類型可以是抽象的。此規則不適用于其子表達式:decltype(f(g())) 中,g() 必須有完整類型,但 f() 不必。

注意:

  • 如果對象的名字帶有括號,那么它會被當做通常的左值表達式,從而 decltype(x) 和 decltype((x)) 通常是不同的類型。

  • 在難以或不可能以標準寫法進行聲明的類型時,decltype 很有用,例如 lambda 相關類型或依賴于模板形參的類型。

2.關鍵詞decltype

示例:

#include <iostream>
#include <type_traits>
 
struct A { double x; };
const A* a;
 
decltype(a->x) y;       // y 的類型是 double(其聲明類型)
decltype((a->x)) z = y; // z 的類型是 const double&(左值表達式)
 
template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) // 返回類型依賴于模板形參
{                                     // C++14 開始可以推導返回類型
    return t+u;
}
 
int main() 
{
    int i = 33;
    decltype(i) j = i * 2;
 
    std::cout << "i = " << i << ", "
              << "j = " << j << '\n';
 
    std::cout << "i 和 j 的類型相同嗎?"
              << (std::is_same_v<decltype(i), decltype(j)> ? "相同" : "不同") << '\n';
 
    auto f = [](int a, int b) -> int
    {
        return a * b;
    };
 
    decltype(f) g = f; // lambda 的類型是獨有且無名的
    i = f(2, 2);
    j = g(3, 3);
 
    std::cout << "i = " << i << ", "
              << "j = " << j << '\n';
}

輸出:

i 和 j 的類型相同嗎?相同
i = 33, j = 66
i = 4, j = 9

感謝各位的閱讀!關于“C++中decltype怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长沙市| 清新县| 宜春市| 白朗县| 台湾省| 佛山市| 明光市| 扎兰屯市| 皋兰县| 察哈| 西林县| 临清市| 太白县| 锡林郭勒盟| 四平市| 东山县| 恩平市| 泸西县| 额尔古纳市| 新蔡县| 江孜县| 施甸县| 金沙县| 巴青县| 仲巴县| 雅安市| 延津县| 盱眙县| 鸡西市| 台中市| 永福县| 建德市| 怀仁县| 囊谦县| 宁阳县| 社旗县| 鄂伦春自治旗| 宁安市| 洛南县| 上高县| 竹北市|