青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

兔子的技術博客

兔子

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新評論

閱讀排行榜

評論排行榜

C++0x引入了新的關鍵字decltype,它是一個操作符,用來取得表達式的類型,主要在泛型編程中使用。這里,簡單介紹一下語法規則。

語法形式:decltype (expression)
其中,這里的括號必不可少(這點不同于sizeof操作符)。decltype(e)可看到是一個類型別名,并且不會對表達式e進行計算(即只有編譯時行為而無運行時行為)。另外,不允許把decltype作用于一個類型,因為沒有任何理由要這樣做。

確定decltype(e)類型的規則如下
Rule-1. 如果e是一個標識符表達式或者類成員訪問表達式,那么decltype(e)就是e所命名的實體的類型。如果沒有此實體或者e命名了一個重載函數集,那么程序是ill-formed的。
Rule-2. 如果e是一個函數調用或者一個重載操作符調用(忽略e外面的括號),那么decltype(e)就是該函數的返回類型。
Rule-3. 否則,假設e的類型是T:如果e是一個左值,則decltype(e)就是T&;否則(e是一個右值),decltype(e)就是T。

舉例分析如下(內容來自參考Ref1):

eg1 名字空間或局部作用域內的變量(Rule-1)
int a;
int& b = a;
const int& c = a;
const int d = 5;
const A e;

(注:不能直接編譯,這里寫出來只是分析)
decltype(a) // int 
decltype(b) // int&
decltype(c) // const int&
decltype(d) // const int
decltype(e) // const A

但需要注意括號可能會影響結果,例如:
decltype((a));  // int& (此時(a)表達式不滿足Rule-1和Rule-2,應用Rule-3,而表達式(a)是一個左值,所以為int&)

eg2 函數形參(Rule-1)
void foo(int a, int& b, float&& c, int* d)
{
    decltype(a) // int
    decltype(b) // int&
    decltype(c) // float&&
    decltype(d) // int*
}

eg3 函數類型(Rule-1)
int foo(char);
int bar(char);
int bar(int);

decltype(foo) // int(char)
decltype(bar) // error, bar is overloaded

但需要注意當形成函數指針時適用Rule-3:
decltype(&foo) // int(*)(char)
decltype(*&foo) // int(&)(char)

eg4 數據類型(Rule-1)
int a[10];
decltype(a)  // int[10]

eg5 成員變量(Rule-1)
class A {
    int a;
    int& b;
    static int c;
    
    void foo() {
        decltype(a)          // int
        decltype(this->a)    // int
        decltype((*this).a)  // int
        decltype(b)          // int&
        decltype(c)          // int (static members are treated as variables in namespace scope)
    }
    void bar() const {
        decltype(a)   // int
        decltype(b)   // int&
        decltype(c)   // int
    }
};

A aa;
const A& caa = aa;
decltype(aa.a)  // int
decltype(aa.b)   // int&
decltype(caa.a)  // int

內置操作符.*和->*適用Rule-3
decltype(aa.*&A::a) // int&
decltype(aa.*&A::b) // illegal, cannot take the address of a reference member
decltype(caa.*&A::a) // const int&

eg6 this(Rule-3)
class X {
    void foo() {
        decltype(this)    // X*,因為this是右值
        decltype(*this)   // X&,因為*this是左值
    }
    void bar() const {
        decltype(this)   // const X*
        decltype(*this)  // const X&
    }
};

eg7 指向成員變量和成員函數的指針(Rule-1)
class A {
    int x;
    int& y;
    int foo(char);
    int& bar() const;
};

decltype(&A::x)    // int A::*
decltype(&A::y)    // error: pointers to reference members are disallowed (8.3.3 (3))
decltype(&A::foo) // int (A::*) (char)
decltype(&A::bar) // int& (A::*) () const

eg8 字面值(Rule-3)
(字符串字面值是左值,其它字面值都是右值)
decltype("decltype") // const char(&)[9]
decltype(1) // int

eg9 冗余的引用符(&)和CV修飾符
由于decltype表達式是一個類型別名,因此冗余的引用符(&)和CV修飾符被忽略:
int& i = ...;
const int j = ...;
decltype(i)&         // int&. The redundant & is ok
const decltype(j)   // const int. The redundant const is ok

eg10 函數調用(Rule-2)
int foo();
decltype(foo())    // int
float& bar(int);
decltype (bar(1))  // float&
class A { ... };
const A bar();
decltype (bar())    // const A
const A& bar2();
decltype (bar2())  // const A&

eg11 內置操作符(Rule-3)
decltype(1+2)     // int (+ returns an rvalue)
int* p;
decltype(*p)        // int& (* returns an lvalue)
int a[10];
decltype(a[3]);     // int& ([] returns an lvalue)
int i; int& j = i;
decltype (i = 5)   // int&, because assignment to int returns an lvalue
decltype (j = 5)   // int&, because assignment to int returns an lvalue
decltype (++i);    // int&
decltype (i++);    // int (rvalue)

如何用程序驗證decltype的結果?可以參考下面的程序對上面的分析結果進行驗證:
F:\tmp>type decltype_eg1.cpp
#include <iostream>
#include <string>
using namespace std;

template <typename T>
string Foo()
{
    return "unknown";
}

template <>
string Foo<int>()
{
    return "int";
}

template <>
string Foo<const int>()
{
    return "const int";
}

template <>
string Foo<int &>()
{
    return "int&";
}

template <>
string Foo<const int&>()
{
    return "const int&";
}

class A{};

template <>
string Foo<A>()
{
    return "A";
}

int main()
{
    int a;
    int &b = a;
    const int &c = a;
    const int d = 5;
    A e;
    double f;

    cout << "a: " << Foo<decltype(a)>() << endl;
    cout << "b: " << Foo<decltype(b)>() << endl;
    cout << "c: " << Foo<decltype(c)>() << endl;
    cout << "d: " << Foo<decltype(d)>() << endl;
    cout << "e: " << Foo<decltype(e)>() << endl;
    cout << "f: " << Foo<decltype(f)>() << endl;
}


F:\tmp>g++ decltype_eg1.cpp -std=c++0x

F:\tmp>a.exe
a: int
b: int&
c: const int&
d: const int
e: A
f: unknown

F:\tmp>gcc --version
gcc (GCC) 4.3.0 20080305 (alpha-testing) mingw-20080502
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


參考資料:
Ref1: Decltype (revision 6): proposed wording
Ref2: Decltype (revision 7): proposed wording


轉自:http://www.cublog.cn/u/18517/showart_1664016.html
posted on 2011-06-23 08:25 會飛的兔子 閱讀(1737) 評論(0)  編輯 收藏 引用 所屬分類: C++及開發環境
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区三区欧美成人| 亚洲美女毛片| 久久精品国产综合精品| 99在线精品视频在线观看| 欧美aaa级| 免费在线观看一区二区| 欧美激情亚洲视频| 日韩午夜精品| 亚洲自拍都市欧美小说| 午夜精品久久| 蜜桃av久久久亚洲精品| 欧美国产日韩一区二区在线观看| 欧美国产专区| 国产精品视频不卡| 狠久久av成人天堂| 99国产精品国产精品久久| 亚洲特级片在线| 久久精品夜夜夜夜久久| 欧美国产日韩在线观看| 一区二区免费在线观看| 欧美亚洲一区三区| 久久躁日日躁aaaaxxxx| 欧美午夜精品久久久久久人妖 | 精品1区2区3区4区| 亚洲精品麻豆| 欧美专区在线观看| 久久免费视频网| 99精品视频免费| 久久精品色图| 欧美午夜电影在线| 精品69视频一区二区三区| 亚洲精品小视频| 久久久久久**毛片大全| 日韩视频一区二区三区| 久久综合色综合88| 国产精品影片在线观看| 99精品99久久久久久宅男| 久久久久国产精品一区| 99re6这里只有精品| 久久影视三级福利片| 国产欧美亚洲精品| 在线视频欧美一区| 欧美激情一区二区三区高清视频| 午夜精品成人在线视频| 欧美日韩直播| 99精品视频免费在线观看| 久久夜色精品国产欧美乱| 亚洲伊人色欲综合网| 欧美日韩亚洲一区二区三区在线| 亚洲精品中文字幕女同| 欧美黑人在线播放| 免费不卡在线观看| 一区在线影院| 久久久久久久精| 性久久久久久久| 国产美女精品| 久久精品国产亚洲高清剧情介绍| 亚洲一区欧美| 国产精品三上| 欧美亚洲专区| 小黄鸭精品aⅴ导航网站入口| 国产精品入口麻豆原神| 欧美在线免费视频| 欧美亚洲日本网站| 好看的亚洲午夜视频在线| 久久免费视频网站| 久久婷婷国产麻豆91天堂| 亚洲国产精品尤物yw在线观看| 免费亚洲一区二区| 欧美成人国产| 亚洲婷婷国产精品电影人久久| 一本久久综合亚洲鲁鲁| 国产精品久久久久一区二区三区共 | 久久亚洲影院| 老司机67194精品线观看| 亚洲国产欧美久久| 亚洲精品国产精品国自产观看浪潮 | 欧美午夜免费影院| 午夜精品久久久久久久99水蜜桃| 亚洲线精品一区二区三区八戒| 国产精品伦一区| 久久久久久久波多野高潮日日 | 亚洲视频第一页| 国产婷婷成人久久av免费高清 | 性做久久久久久免费观看欧美| 国内精品久久久久影院 日本资源| 蜜臀久久久99精品久久久久久| 另类天堂视频在线观看| 一个人看的www久久| 亚洲欧美变态国产另类| 一色屋精品视频免费看| 99视频+国产日韩欧美| 国产日韩精品一区二区三区| 欧美福利一区| 国产精品推荐精品| 男同欧美伦乱| 国产精品久久久久久久久久免费看| 久久精品人人爽| 欧美精品一区二区三区久久久竹菊 | 国产欧美日韩高清| 亚洲第一精品在线| 国产欧美韩日| 亚洲精品久久久蜜桃| 国产午夜精品一区二区三区欧美 | 久久综合给合久久狠狠狠97色69| 一区二区冒白浆视频| 久久精品99国产精品酒店日本| 夜夜嗨av色综合久久久综合网| 香蕉精品999视频一区二区| 亚洲精品国产欧美| 欧美一区二区三区在线| av成人天堂| 久久综合色天天久久综合图片| 久久超碰97中文字幕| 欧美欧美全黄| 欧美黄色大片网站| 国产日韩视频| 亚洲性xxxx| 亚洲视频一区在线观看| 蜜桃av一区二区在线观看| 久久精品国产亚洲aⅴ| 国产精品综合色区在线观看| 亚洲另类黄色| 日韩一级片网址| 欧美成人午夜影院| 欧美福利精品| 亚洲毛片一区二区| 欧美大片在线看| 亚洲高清自拍| 美女图片一区二区| 国产亚洲综合精品| 一区二区三区日韩欧美精品| 日韩一级成人av| 欧美精品日韩www.p站| 亚洲成人中文| 亚洲国产精品免费| 久久影院亚洲| 欧美激情精品久久久久久蜜臀| 在线国产精品播放| 久热国产精品| 亚洲国产午夜| 这里只有精品丝袜| 国产精品久久久久久av福利软件| 宅男精品视频| 欧美一区二区在线免费播放| 国产精品视区| 久久成人在线| 欧美成人a∨高清免费观看| 亚洲国产精品激情在线观看| 免费看成人av| 99国内精品久久| 欧美在线一二三四区| 很黄很黄激情成人| 欧美a级一区| 99国产精品| 久久精品国亚洲| 亚洲欧洲精品一区二区三区| 欧美日韩中文在线| 欧美在线视频一区二区| 久久青青草综合| 亚洲精品一区二区三区福利| 欧美性片在线观看| 久久成人亚洲| 日韩一级片网址| 久久天天综合| 一区二区三区免费网站| 国产三区精品| 欧美成人精品福利| 亚洲一区久久久| 欧美激情第8页| 亚洲欧美在线x视频| 在线成人激情视频| 欧美色大人视频| 老**午夜毛片一区二区三区| 99在线精品视频| 欧美大片在线观看一区二区| 亚洲男同1069视频| 亚洲激情国产| 国产综合香蕉五月婷在线| 欧美高清视频一区二区三区在线观看 | 国产在线不卡视频| 欧美国产日韩视频| 欧美亚洲在线观看| 亚洲精品国产系列| 葵司免费一区二区三区四区五区| 亚洲视频一二三| 亚洲国产日韩欧美在线99| 欧美天天视频| 欧美国产日韩一区二区| 久久久久久电影| 亚洲欧美在线网| 夜夜狂射影院欧美极品| 欧美成人精品一区| 久久久亚洲午夜电影| 亚洲欧美激情在线视频| 99精品久久| 亚洲精品欧美精品| 亚洲第一主播视频| 激情久久久久久久久久久久久久久久 | 欧美在线看片|