Несовместимости C++0x с C++03
От: Masterkent  
Дата: 13.04.11 16:42
Оценка: 47 (9)
Документ N3288 "Appendix C: ISO C++ 2003 Compatibility, Revision 7" наконец-то появился в открытом доступе. В нём описан официальный перечень обнаруженных комитетом по стандартизации несовместимостей C++0x с C++03. Он также есть в приложении C.2 C++ and ISO C++ 2003 [diff.cpp03] FDIS N3290/N3291.

В данном списочке как минимум не хватает следующего:

  Скрытый текст
 
1) В С++03 формирование cсылки на ссылку может привести к deduction failure, в C++0x применяется правило сворачивания ссылок.

    #include <iostream>

    template <class T>
        void f(...)
            { std::cout << "C++03"; }

    template <class T>
        void f(T &)
            { std::cout << "C++0x"; }

    int main()
    {
        int n = 0;
        f<int &>(n);
    }

2) В C++03 формирование cv-квалифицированного типа функции может привести к deduction failure, в C++0x в подобной ситуации cv-квалификация будет просто отброшена.

    #include <iostream>

    template <class T>
        void f(T &)
            { std::cout << "C++03"; }

    template <class T>
        void f(T const &)
            { std::cout << "C++0x"; }
            
    void g() {}

    int main()
    {
        f(g);
    }

3) В C++03 неявное преобразование строкового литерала к char * хоть и было deprecated, но всё ж-таки было, в C++0x его вообще убрали.

    #include <iostream>

    void f(char *)
        { std::cout << "C++03"; }

    void f(...)
        { std::cout << "C++0x"; }

    int main()
    {
        f("string literal");
    }

4) В C++03 thread_local — обычный идентификатор, а в C++0x — ключевое слово, обозначающее storage-class-specifier. Можно показать, что формулировка "Valid ISO/IEC 14882:2003 code using these identifiers is invalid in this International Standard" из N3288 неточна — валидная программа может остаться валидной, но изменить смысл:

    #include <iostream>

    struct X
    {
        X(int)
            { std::cout << "C++03"; }
        X()
            { std::cout << "C++0x"; }
    };

    int n = 0;

    int main()
    {        
        X thread_local(n);           
    }

5) Access declarations, допускаемые C++03, не допускаются в C++0x:

    struct B
    {
    protected:
        void f() {}
    };
 
    struct D : B
    {
        B::f; // valid in C++03, invalid in C++0x
    };
 
    int main()
    {
        D().f();
    }


(первые 4 примера я скопипастил из своего недавнего поста)

P.S. Это можно назвать несколько более полным ответом на вопрос тут
Автор: sumkincpp
Дата: 15.03.11
Re: Несовместимости C++0x с C++03
От: Ka3a4oK  
Дата: 15.04.11 11:20
Оценка:
M>5) Access declarations, допускаемые C++03, не допускаются в C++0x:

M>
    struct B
M>    {
M>    protected:
M>        void f() {}
M>    };
 
M>    struct D : B
M>    {
M>        B::f; // valid in C++03, invalid in C++0x
M>    };
 
M>    int main()
M>    {
M>        D().f();
M>    }


Пятый пункт — совсем зря, ИМХО.
Re[2]: Несовместимости C++0x с C++03
От: Lorenzo_LAMAS  
Дата: 15.04.11 11:28
Оценка:
KK>Пятый пункт — совсем зря, ИМХО.

большинство С++ программистов и знать не знают о таком синтаксисе, неужто кто-то еще и пользуется им???
Используйте using-declaration, access declaration давно считался deprecated. По-моему, этот пункт как раз фигня.
Of course, the code must be complete enough to compile and link.
Re[3]: Несовместимости C++0x с C++03
От: Ka3a4oK  
Дата: 15.04.11 15:00
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

KK>>Пятый пункт — совсем зря, ИМХО.


L_L>большинство С++ программистов и знать не знают о таком синтаксисе, неужто кто-то еще и пользуется им???

L_L>Используйте using-declaration, access declaration давно считался deprecated. По-моему, этот пункт как раз фигня.

Невнимательно прочитал. Показалось, что они запретили видимость членов public по-умолчанию для структур, и теперь придется явно указывать.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.