#cpp #cpp11 #cpp14 #cpp17
Понятно, что изменение смысла auto от одного стандарта к другому приводит к возможности ошибки, или, наоборот, ошибочный из-за >> в шаблоне код становится нормальным. А есть код, который при переходе от стандарта С++03 к С++11 (ну, или 14) меняет свой смысл? Работает и там и там но дает разные результаты? Или даже в С++17? Короче, от одного какого-то стандарта к другому?
Ответы
Ответ 1
В конце стандарта есть приложение "Совместимость", в котором перечислены все несовместимости с предыдущими стандартами. Раздел про совместимость текущего стандарта и С++03 Несовместимостей много. Вот первая по списку: #define u8 "abc" const char* s = u8"def"; // Раньше "abcdef", теперь "def"Ответ 2
Я не такой талант, чтоб придумать настолько тонкое свое, так что "постою на плечах гигантов" (с) Ньютон :) В "C++ Templates" Вандевурда и компании есть такой пример: #includetemplate struct X { static int const c = 2; }; template<> struct X<0> { typedef int c; }; template struct Y { static int const c = 3; }; static int const c = 4; int main() { std::cout << (Y >::c >::c >::c) << ' '; std::cout << (Y >::c >::c >::c) << '\n'; } Результаты работы в старом и новом стандартах: https://ideone.com/kQi07Y и https://ideone.com/6l8ckM Идея понятна? Y >::c >::c >::c - в старом стандарте 1 сдвигаем на глобальную c, получаем 0, Y ::c> дает Y , ну а Y ::c - это 3. В новом стандарте Y >::c равно 3, дальше сравниваем с глобальной c, равной 4, получаем false, опять сравниваем с глобальной c, получаем 0>4 == false, выводится 0...
Комментариев нет:
Отправить комментарий