簡體   English   中英

std :: add_lvalue_reference和std :: add_rvalue_reference的目的是什么?

[英]What is the purpose of std::add_lvalue_reference and std::add_rvalue_reference?

std::add_lvalue_referencestd::add_rvalue_reference的目的是什么?

似乎使用T & / T &&也是如此,因為這成功編譯:

#include <utility>

int main() {
    { using T = int;    static_assert(std::is_same_v<std::add_lvalue_reference_t<T>, T &>); };
    { using T = int &;  static_assert(std::is_same_v<std::add_lvalue_reference_t<T>, T &>); };
    { using T = int &&; static_assert(std::is_same_v<std::add_lvalue_reference_t<T>, T &>); };

    { using T = int;    static_assert(std::is_same_v<std::add_rvalue_reference_t<T>, T &&>); };
    { using T = int &;  static_assert(std::is_same_v<std::add_rvalue_reference_t<T>, T &&>); };
    { using T = int &&; static_assert(std::is_same_v<std::add_rvalue_reference_t<T>, T &&>); };
}

void&並且形成不良。 std::add_lvalue_reference<void> void

通常,如果不可能, add_lvalue_reference不會添加對類型的引用。 Per [meta.trans.ref]

 template <class T> struct add_lvalue_reference; 

如果T命名為可引用類型,則成員typedef type命名為T& ; 否則, type名稱T [ 注意:此規則反映了引用折疊的語義([dcl.ref])。 - 結束說明 ]

什么是可參考類型? Per [defns.referenceable] ,可引用的類型是

對象類型,沒有cv限定符或ref-qualifier的函數類型,或引用類型[ 注意:該術語描述了可以創建引用的類型,包括引用類型。 - 結束說明 ]

在所有情況下,它們都不一樣。 std::add_lvalue_referencestd::add_rvalue_reference是,

1)如果T是對象類型或沒有cv-或ref-限定符的函數類型,則提供成員typedef類型,即T&。 如果T是某個類型U的右值引用,則類型為U&。 否則,輸入為T.

2)如果T是對象類型或沒有cv-或ref-限定符的函數類型,則提供成員typedef類型,即T &&,否則type為T.

例如,對於具有cv-或ref-qualifier的函數類型,結果將是不同的。 以下代碼失敗,

{ using T = void() const;    static_assert(std::is_same_v<std::add_lvalue_reference_t<T>, T &>); };

結果std::add_lvalue_reference就是T這里。

{ using T = void() const;    static_assert(std::is_same_v<std::add_lvalue_reference_t<T>, T>); };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM