gpt4 book ai didi

c++ - 本地类 : C++03 vs. C++11

转载 作者:IT老高 更新时间:2023-10-28 21:47:14 26 4
gpt4 key购买 nike

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: error: no matching function for call to ‘f(main()::S)’

但是,在 C++11 模式 ( ideone ) 下编译时它编译得很好,这对我来说很有意义,否则 lambda 将无法工作。所以我猜想本地类的使用至少有这种变化。我对吗?本地类(class)还有哪些其他变化?

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

最佳答案

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

  • C++03

    A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argument for a template type-parameter. [Example:

    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] [Note: a template type argument may be an incomplete type (3.9). ]

  • C++0x (n3290)

    [ Example:

    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
    }

    — end example ] [ Note: A template type argument may be an incomplete type (3.9). — end note ]

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

关于c++ - 本地类 : C++03 vs. C++11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8203750/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com