2011-06-20 28 views
14

我們不允許在函數內部定義函數結構,因爲不允許在函數模板的實例化中使用函數聲明的結構。ISO C++ 03對函數作用域中定義的結構有什麼限制?

是否還有其他重要的陷阱需要注意?例如。這會不好:

int foo() 
{ 
    struct Scratch 
    { 
     int a, b, c; 
    }; 
    std::vector<Scratch> workingBuffer; 
    //Blah Blah 
} 
+1

@Nawaz:這不是一個確切的副本我認爲 – 2011-06-20 18:22:03

+0

@ 0A0D:這裏提出的問題類型已經在該主題中得到了解答。因此可能有重複。 – Nawaz

+2

@比利:在這種情況下,讓我複製粘貼我的答案從其他主題。 – Nawaz

回答

22

1. C++標準禁止在模板中使用本地定義的類。

14.3.1/2本地類型,沒有鍵,無名類型或任何這些類型的配混一個類型的類型不應被用作模板參數的用於模板類型-參數。

A碼例如:

template <class T> class X { /* ... */ }; 
    void f() 
    { 
     struct S { /* ... */ }; 
     X<S> x3; // error: local type used as 
       // template-argument 
     X<S*> x4; // error: pointer to local type 
       // used as template-argument 
    } 

下面是來自IBM文檔多一點參考:

2.聲明在本地類只能使用類型名稱,枚舉,靜態變量從封閉範圍,以及外部變量和功能。

一個代碼示例:

int x;       // global variable 
void f()      // function definition 
{ 
     static int y;   // static variable y can be used by 
           // local class 
     int x;     // auto variable x cannot be used by 
           // local class 
     extern int g();   // extern function g can be used by 
           // local class 

     class local    // local class 
     { 
      int g() { return x; }  // error, local variable x 
             // cannot be used by g 
      int h() { return y; }  // valid,static variable y 
      int k() { return ::x; } // valid, global x 
      int l() { return g(); } // valid, extern function g 
     }; 
} 

int main() 
{ 
     local* z;    // error: the class local is not visible 
     return 0; 
} 

3.一種局部類不能有靜態數據成員

一個代碼示例:

void f() 
{ 
    class local 
    { 
     int f();    // error, local class has noninline 
          // member function 
     int g() {return 0;} // valid, inline member function 
     static int a;   // error, static is not allowed for 
          // local class 
     int b;    // valid, nonstatic variable 
    }; 
} 
+0

+1爲標準參考。還有什麼其他的陷阱需要注意? –

0

是的。本地類不能用作C++中的模板參數03

+0

你有參考嗎?我知道你不允許使用它們來進行函數模板的參數推導 - 但不一定需要手動實例化類。 –

1

本地結構/類不能有靜態數據成員,只有s tatic成員函數。而且,他們不能成爲模板。

2

本地類的範圍是它們被定義的函數。但這本身並不有趣。

是什麼使局部類有趣的是,如果他們實現一些接口,那麼你就可以創建它(使用new)實例並返回它們,從而使實施訪問通過基類指針甚至功能之外。

約局部類其他一些事實:

  • 他們不能定義靜態成員變量。

  • 它們不能訪問封閉函數的非靜態「自動」局部變量。但他們可以訪問static變量。

  • 它們可以在模板函數中使用。但是,它們不能用作模板參數

  • 如果他們在模板函數內部定義,那麼他們可以使用封閉函數的模板參數。

  • 本地類是final的,這意味着函數外部的用戶不能從本地類派生到函數。如果沒有本地類,您必須在單獨的翻譯單元中添加一個未命名的名稱空間。

  • 本地類用於創建trampoline functions通常稱爲thunks

從標準(2003)

9.8的一些參考文獻本地類聲明[class.local]

\ 1。一個類可以在一個函數定義中定義;這樣的班級是 ,稱爲本地班級。 本地類的名​​稱在其圍繞的 範圍內。本地類位於封閉示波器的 範圍內,並且具有對 函數以外的名稱的相同訪問權限,正如封裝的 函數一樣。本地 類中的聲明只能使用類型名稱,靜態變量 ,外部變量和 函數以及來自 的枚舉器。

[Example: 

int x; 
void f() 
{ 
    static int s ; 
    int x; 
    extern int g(); 

    struct local { 
     int g() { return x; } // error: x is auto 
     int h() { return s; } // OK 
     int k() { return ::x; } // OK 
     int l() { return g(); } // OK 
    }; 
// ... 
} 
local* p = 0; // error: local not in scope 

—end example] 

\ 2。封閉函數對本地類的成員沒有特殊訪問權限;它服從通常的訪問規則 (第11條)。 本地類的成員函數應在 的類定義內定義,如果它們全部定義爲 。

\ 3。如果類X爲嵌套類Y可以在 類X被聲明,後來在類X的 定義中所定義或稍後 在同一範圍爲類X的定義 一類內嵌套 定義的本地類本地班是本地班。

\ 4。本地類不得有靜態數據成員。

0

本地結構是完全合法的,即使在C++ 98中也是如此。儘管你不能在C++ 98中使用它們,但是你可以在C++ 0x中使用它們。 g ++ 4.5支持在-std = C++ 0x模式下使用帶有模板的本地結構。

+0

我認爲ideone使用C++ 0x 4.5,但它仍然給本地'模板結構'錯誤http://www.ideone.com/5xhWE – iammilind

相關問題