本地类:C ++ 03与C ++ 11

时间:2011-11-20 18:43:20

标签: c++ templates c++11 local-class

C ++ 11中本地类的用法是否有任何变化?

似乎在C ++ 03中,本地类不能用作模板参数(我记得)。

考虑这段代码,

template<typename T> void f(const T&) {}

//Note : S is a local class defined inside main()
int main() { struct S{};  f(S()); } //I want template argument to be deduced.

但它给出了编译错误(C ++ 03模式),说(ideone):

  

prog.cpp:4:错误:没有匹配函数来调用'f(main():: S)'

但是,在C ++ 11模式(ideone)中编译它时编译很好,这对我来说很有意义,否则lambda将无效。所以我想至少在本地类的使用方面有这种变化。我对吗?关于当地班级的其他变化是什么?

请引用标准(C ++ 03和C ++ 11)中的相关文本,以便读者可以比较自己,以供将来参考。

3 个答案:

答案 0 :(得分:12)

通过比较两个标准中的§14.3.1/ 2,可以看出差异。

  • C ++ 03

      

    本地类型,没有链接的类型,未命名的类型或由这些类型中的任何一种复合的类型   不能用作模板类型参数的模板参数。 [实施例:

    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
    }
    
      

    -end example] [注意:模板类型参数可能是不完整的类型(3.9)。 ]

  • C ++ 0x(n3290)

      

    [例如:

    template <class T> class X { };
    template <class T> void f(T t) { }
    struct { } unnamed_obj;
    
    void f() {
     struct A { };
     enum { e1 };
     typedef struct { } B;
     B b;
     X<A> x1;        // OK
     X<A*> x2;       // OK
     X<B> x3;        // OK
     f(e1);          // OK
     f(unnamed_obj); // OK
     f(b);           // OK
    }
    
      

    - 结束示例] [注意:模板类型参数可能是不完整类型(3.9)。 - 结束说明]

C ++ 03明确禁止模板类型参数中的本地类。 C ++ 11没有,甚至包括一个有效使用它的例子。

答案 1 :(得分:10)

来自旧标准:

  

(14.3)本地类型,没有链接的类型,未命名的类型或从这些类型中复合的类型不得用作模板类型参数的模板参数。

似乎在C ++ 11标准中被删除了。

更多限制:

  

(9.8)本地班级的声明可以   仅使用类型名称,静态变量,外部变量和函数以及封闭的枚举器   范围。

     

(9.8)本地类不应有成员模板。

     

(14.5.4)朋友模板不得在本地类中声明。

     

(9.4.2)本地类不应有静态数据成员。

     

(9.3)本地类(9.8)的成员函数没有链接。

答案 2 :(得分:2)

根据my own question,限制被删除,本地类可以用作模板参数 我认为没有提到新标准。