Документ
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
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> }
Пятый пункт — совсем зря, ИМХО.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
KK>>Пятый пункт — совсем зря, ИМХО.
L_L>большинство С++ программистов и знать не знают о таком синтаксисе, неужто кто-то еще и пользуется им???
L_L>Используйте using-declaration, access declaration давно считался deprecated. По-моему, этот пункт как раз фигня.
Невнимательно прочитал. Показалось, что они запретили видимость членов public по-умолчанию для структур, и теперь придется явно указывать.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>