局部类:c++ 03与c++ 11

Local classes : C++03 vs. C++11

本文关键字:c++ 局部      更新时间:2023-10-16

在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)中的相关文本,以便读者进行比较,并供将来参考。

通过比较两个标准中的§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++ 0 x (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没有,甚至还包含了一个有效使用这种方法的例子。

源自旧标准:

(14.3)局部类型、没有链接的类型、未命名类型或由这些类型组合而成的类型,不得用作模板类型形参的模板实参。

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

更多的限制:

(9.8)局部类中的声明可以只使用类型名、静态变量、外部变量和函数,以及外围的枚举数范围。

(9.8)局部类不能有成员模板。

(14.5.4)友元模板不能在局部类中声明。

(9.4.2)局部类不能有静态数据成员。

(9.3)局部类(9.8)的成员函数没有关联。

根据我自己的问题,限制被取消了,局部类可以用作模板参数。
但是我没有看到任何关于新标准的参考。