![](/img/trans.png)
[英]add_lvalue_reference/add_rvalue_reference and cv-qualified type
[英]What is the purpose of std::add_lvalue_reference and std::add_rvalue_reference?
std::add_lvalue_reference
和std::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_reference
, std::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.