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

Naw*_*waz 21 c++ templates local-class c++11

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.
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Mat*_*Mat 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
    }
    
    Run Code Online (Sandbox Code Playgroud)

    -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
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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


Pub*_*bby 10

从旧标准:

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

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

更多限制:

(9.8)本地类中的声明只能使用类型名称,静态变量,外部变量和函数以及封闭范围内的枚举器.

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

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

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

(9.3)本地班级的成员职能(9.8)没有联系.