溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++中decltype怎么用

發(fā)布時(shí)間:2021-12-08 11:06:08 來(lái)源:億速云 閱讀:286 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)C++中decltype怎么用的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

1.語(yǔ)法

decltype ( 實(shí)體 ) (1) (C++11 起)
decltype ( 表達(dá)式 ) (2) (C++11 起)

解釋:

1) 如果實(shí)參是沒(méi)有括號(hào)的標(biāo)識(shí)表達(dá)式或沒(méi)有括號(hào)的類成員訪問(wèn)表達(dá)式,那么 decltype 產(chǎn)生以該表達(dá)式命名的實(shí)體的類型。如果沒(méi)有這種實(shí)體或該實(shí)參指名了一組重載函數(shù),那么程序非良構(gòu)。

  • 如果實(shí)參是指名某個(gè)結(jié)構(gòu)化綁定的沒(méi)有括號(hào)的標(biāo)識(shí)表達(dá)式,那么 decltype 產(chǎn)生其被引用類型(在關(guān)于結(jié)構(gòu)化綁定聲明的說(shuō)明中有所描述)。

  • 如果實(shí)參是指名某個(gè)非類型模板形參的沒(méi)有括號(hào)的標(biāo)識(shí)表達(dá)式,那么 decltype 生成該模板形參的類型(當(dāng)該模板形參以占位符類型聲明時(shí),類型會(huì)先進(jìn)行任何所需的類型推導(dǎo))。

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

  • 如果 表達(dá)式 的值類別是亡值,將會(huì) decltype 產(chǎn)生 T&&;

  • 如果 表達(dá)式 的值類別是左值,將會(huì) decltype 產(chǎn)生 T&;

  • 如果 表達(dá)式 的值類別是純右值,將會(huì) decltype 產(chǎn)生 T。

如果 表達(dá)式 是返回類類型純右值的函數(shù)調(diào)用,或是右操作數(shù)為這種函數(shù)調(diào)用的逗號(hào)表達(dá)式,那么不會(huì)對(duì)該純右值引入臨時(shí)量。

如果 表達(dá)式 是除了(可帶括號(hào)的)立即調(diào)用以外的 (C++20 起)純右值,那么不會(huì)從該純右值實(shí)質(zhì)化臨時(shí)對(duì)象:即這種純右值沒(méi)有結(jié)果對(duì)象。

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

注意:

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

  • 在難以或不可能以標(biāo)準(zhǔn)寫法進(jìn)行聲明的類型時(shí),decltype 很有用,例如 lambda 相關(guān)類型或依賴于模板形參的類型。

2.關(guān)鍵詞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&(左值表達(dá)式)
 
template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) // 返回類型依賴于模板形參
{                                     // C++14 開(kāi)始可以推導(dǎo)返回類型
    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 的類型是獨(dú)有且無(wú)名的
    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

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

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI