ISO C ++ 03对函数范围定义的结构有什么限制?

时间:2011-06-20 18:08:36

标签: c++ c++03

我们不允许在函数内部定义functor结构,因为不允许在函数模板的实例化中使用函数声明的结构。

还有其他重要的陷阱需要注意吗?例如。这会不好:

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

5 个答案:

答案 0 :(得分:22)

1。 C ++标准禁止在模板中使用本地定义的类。

14.3.1 / 2 本地类型,没有链接的类型,未命名类型或从这些类型中复合的类型不得用作模板参数对于模板类型参数。

代码示例:

    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
    };
}

答案 1 :(得分:2)

本地类的范围是它们被定义的函数。但是它本身并不感兴趣 1

使本地类感兴趣的是如果它们实现了某个接口,那么你可以创建它的实例(使用new)并返回它们,从而使实现可通过基类指针访问 甚至在函数外部。

关于本地课程的其他一些事实:

  • 他们无法定义静态成员变量。

  • 他们无法访问封闭函数的非静态“自动”局部变量。但他们可以访问static变量。

  • 它们可用于模板功能。但是,它们不能用作模板参数

  • 如果他们在模板函数中定义,那么他们可以使用封闭函数的模板参数。

  • 本地类是final,这意味着函数外部的用户无法从本地类派生到函数。如果没有本地类,则必须在单独的翻译单元中添加未命名的命名空间。

  • 本地类用于创建trampoline functions,通常称为 thunks

标准(2003)的一些参考文献

9.8本地类声明[class.local]

  

\ 1。可以在函数定义中定义类;这样的课是   叫一个本地班。一个名字   本地班级是其附近的本地班级   范围。本地类在范围内   封闭范围,并具有   同样访问外面的名字   与封闭一样起作用   功能。在当地的声明   class只能使用类型名称,静态   变量,外部变量和   来自的函数和枚举器   封闭范围。

[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。本地类不应具有静态数据成员。

答案 2 :(得分:1)

本地结构/类不能有静态数据成员,只能有静态成员函数。此外,它们不能是模板。

答案 3 :(得分:0)

是。本地类不能用作C ++ 03中的模板参数

答案 4 :(得分:0)

本地结构是完全合法的,即使在C ++ 98中也是如此。但是,您不能在C ++ 98中将它们与模板一起使用,而您可以在C ++ 0x中使用它们。 g ++ 4.5支持在-std = c ++ 0x模式下使用带有模板的本地结构。