剛剛看到一篇 C++ 博客,里面講到用模板偏特化和 decltype()
識別值類別:lvalue
glvalue
xvalue
rvalue
prvalue
。依照博客的方法試了一下,發(fā)現(xiàn)根本行不通。之后,我查閱了一下 cppreference.com 關于 decltype
關鍵字的描述,發(fā)現(xiàn)了 decltype((表達式))
具有以下特性:
成都創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)營銷推廣、網(wǎng)站重做改版、甘谷網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、成都h5網(wǎng)站建設、商城網(wǎng)站制作、集團公司官網(wǎng)建設、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為甘谷等各大城市提供網(wǎng)站開發(fā)制作服務。
xvalue
,decltype
將會產(chǎn)生 T&&
;lvalue
,decltype
將會產(chǎn)生 T&
;prvalue
,decltype
將會產(chǎn)生 T
。也就是可以細分 xvalue
和 lvalue
,于是嘗試將模板偏特化和 decltype(())
結合,發(fā)現(xiàn)這種方法可行。
#include
#include
template struct is_lvalue : std::false_type {};
template struct is_lvalue : std::true_type {};
template struct is_xvalue : std::false_type {};
template struct is_xvalue : std::true_type {};
template struct is_glvalue : std::integral_constant::value || is_xvalue::value> {};
template struct is_prvalue : std::integral_constant::value> {};
template struct is_rvalue : std::integral_constant::value> {};
struct A
{
int x = 1;
};
int main()
{
A a;
std::cout << std::boolalpha
<< is_lvalue::value << std::endl
<< is_glvalue::value << std::endl
<< is_xvalue::value << std::endl
<< is_rvalue::value << std::endl
<< is_prvalue::value << std::endl
<< std::endl
<< is_lvalue::value << std::endl
<< is_glvalue::value << std::endl
<< is_xvalue::value << std::endl
<< is_rvalue::value << std::endl
<< is_prvalue::value << std::endl
<< std::endl
<< is_lvalue::value << std::endl
<< is_glvalue::value << std::endl
<< is_xvalue::value << std::endl
<< is_rvalue::value << std::endl
<< is_prvalue::value << std::endl
<< std::endl
<< is_lvalue::value << std::endl
<< is_glvalue::value << std::endl
<< is_xvalue::value << std::endl
<< is_rvalue::value << std::endl
<< is_prvalue::value << std::endl
;
}
輸出
true
true
false
false
false
true
true
false
false
false
false
false
false
true
true
false
true
true
true
false
所有的輸出結果都符合預期。