Я знаю, что, по крайней мере, одно из изменений в C ++ 11, которое приведет к тому, что старый код перестанет компилироваться: введение explicit operator bool()
в стандартную библиотеку, замена старых экземпляров operator void*()
. Конечно, код, который это нарушит, - это, вероятно, код, который в первую очередь не должен был быть действительным, но, тем не менее, это является серьезным изменением: программы, которые раньше были действительными, больше не являются.
Есть ли другие переломные изменения?
export
ключевого слова? Я принесу мне пальто.mystream.good()
это не то же самое, чтоbool(mystream)
?good()
Значение true, если флаг не установлен.bool(mystream)
все еще ложь, если толькоeofbit
установлен.!mystream.fail()
будет правильным эквивалентом.Ответы:
В FDIS есть раздел о несовместимостях, в приложении
C.2
«C ++ и ISO C ++ 2003».Резюме, перефразируя FDIS здесь, чтобы сделать его (лучше) пригодным в качестве SO ответа. Я добавил несколько собственных примеров, чтобы проиллюстрировать различия.
Есть несколько несовместимостей, связанных с библиотекой, в которых я точно не знаю последствий, поэтому я оставляю их другим.
Основной язык
(по общему признанию не действительно проблема совместимости для большинства людей).
Пример от меня:
Такой размер трюков использовался некоторыми SFINAE, и теперь его нужно изменить :)
Пример от меня:
Этот код вызывает
terminate
в C ++ 0x, но не в C ++ 03. Потому что неявная спецификация исключенияA::~A
в C ++ 0x естьnoexcept(true)
.В C ++ 03
>>
всегда будет токен оператора сдвига.Пример от меня:
В C ++ 03 это вызывает
f(long)
, но в C ++ 0x это вызываетf(int)
. Следует отметить, что как в C ++ 03, так и в C ++ 0x выполняются следующие вызовыf(B)
(контекст экземпляра все еще рассматривает только объявления внешних связей).Лучшее соответствие
f(A)
не берется, потому что оно не имеет внешней связи.Изменения в библиотеке
источник
export
, то я думаю, что другие TU не должны были бы полагаться на явное создание экземпляра, но могли бы сами создать экземпляр шаблона. Тогда будет иметь значение, будут ли внутренние контекстные функции видны в контексте реализации.Значение ключевого слова auto изменилось.
источник
auto
ключевое слово, что-то не так с вашим кодом. С какой стати ты это использовал?auto
остается действительным в C ++ 11.int main() { auto int i = 0; return i; }
совершенно корректно C ++ 03, но синтаксическая ошибка в C ++ 11. Единственное предупреждение, которое я могу получить от компиляторов в режиме C ++ 03, - это предупреждение о совместимости.Срочные перемены?
Ну, во - первых, если вы использовали
decltype
,constexpr
,nullptr
и т.д. в качестве идентификаторов , то вы можете быть в беде ...источник
Некоторые основные несовместимости, которые не охвачены разделом несовместимости:
C ++ 0x обрабатывает введенное имя класса как шаблон, если имя передается в качестве аргумента параметра шаблона, и как тип, если оно передается параметру типа шаблона.
Действительный код C ++ 03 может вести себя по-разному, если он полагается, что введенное имя класса всегда будет типом в этих сценариях. Пример кода взят из моего пиара
В C ++ 03 код вызывает второй
g
раз оба раза.C ++ 0x делает некоторые имена, которые были зависимы в C ++ 03, теперь не зависимыми. И требует, чтобы поиск по имени для независимых независимых квалифицированных имен, которые ссылаются на члены текущего шаблона класса, повторялись при создании экземпляра, и требует проверки того, что эти имена ищут так же, как это делается в контексте определения шаблона.
Действительный код C ++ 03, который зависит от правила доминирования, может больше не компилироваться из-за этого изменения.
Пример:
Этот действительный код C ++ 03, который вызывает
A<int>::f
, недопустим в C ++ 0x, потому что поиск имени при создании экземпляра будет обнаружен,A<int>::f
а неB::f
вызовет конфликт с поиском по определению.На данный момент не ясно, является ли это дефектом в FDIS. Комитет знает об этом и оценит ситуацию.
Объявление using, в котором последняя часть совпадает с идентификатором в последней части квалификатора в квалифицированном имени, обозначающем базовый класс, при использовании объявления теперь именуется конструктор, а не члены с таким именем.
Пример:
Приведенный выше пример кода хорошо сформирован в C ++ 03, но плохо сформирован в C ++ 0x, так как
A::B
до сих пор недоступен вmain
.источник
Ошибка извлечения потока обрабатывается по-разному.
пример
Изменить предложение
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3246.html#23
Стандартная ссылка
Реализации
GCC 4.8 правильно выводит для C ++ 11 :
GCC 4.5-4.8 все выводит для C ++ 03 следующее, что может показаться ошибкой:
Visual C ++ 2008 Express правильно выводит для C ++ 03:
Visual C ++ 2012 Express неправильно выводит для C ++ 11, что может показаться проблемой состояния реализации:
источник
Как введение операторов явного преобразования является переломным изменением? Старая версия по-прежнему будет такой же «действительной», как и раньше.Да, изменение с
operator void*() const
наexplicit operator bool() const
будет критическим изменением, но только в том случае, если оно используется неправильно и само по себе. Соответствующий код не будет нарушен.Теперь еще одно серьезное изменение - запрет сужающих конверсий во время инициализации агрегата :
Редактировать : просто запомнить,
std::identity<T>
будет удален в C ++ 0x (см. Примечание). Это удобная структура, чтобы сделать типы зависимыми. Поскольку структура на самом деле ничего не делает, это должно исправить это:источник
operator void*
.bool ok = cin >> a; cout << "done reading" << endl; if (ok) { ... }
в этом нет ничего действительно плохого в C ++ 03, но это стало ошибкой в C ++ 11. (Примечание: GCC 4.9 все ещеoperator void*() const
здесь, поэтому он принимает код в режиме C ++ 11.)std::identity<T>
не был удален в C ++ 11, потому что он не был частью C ++ 03. Он кратко существовал в проекте для C ++ 11 и был удален из проекта до стандартизации.В библиотеку контейнеров внесены многочисленные изменения, которые обеспечивают более эффективный код, но бесшумно нарушают обратную совместимость для нескольких ключевых случаев.
Рассмотрим, например,
std::vector
конструкцию по умолчанию, C ++ 0x и внесение изменений .источник
Было много дискуссий о неявном движении, нарушающем обратную совместимость
( старая страница с соответствующим обсуждением )
Если вы читаете в комментариях, неявный возврат хода также является серьезным изменением.
источник
C ++ 03: действителен
C ++ 0x:
error: parameter declared 'auto'
источник
struct x
и без имени.Особенности языка
>>
Стандартные библиотечные компоненты
Устаревшие Особенности
источник