Страницы

Поиск по вопросам

суббота, 7 декабря 2019 г.

Код, по-разному работающий в C++03 и C++11/14

#cpp #cpp11 #cpp14 #cpp17


Понятно, что изменение смысла auto от одного стандарта к другому приводит к возможности
ошибки, или, наоборот, ошибочный из-за >> в шаблоне код становится нормальным.

А есть код, который при переходе от стандарта С++03 к С++11 (ну, или 14) меняет свой
смысл? Работает и там и там но дает разные результаты? 

Или даже в С++17? Короче, от одного какого-то стандарта к другому?
    


Ответы

Ответ 1



В конце стандарта есть приложение "Совместимость", в котором перечислены все несовместимости с предыдущими стандартами. Раздел про совместимость текущего стандарта и С++03 Несовместимостей много. Вот первая по списку: #define u8 "abc" const char* s = u8"def"; // Раньше "abcdef", теперь "def"

Ответ 2



Я не такой талант, чтоб придумать настолько тонкое свое, так что "постою на плечах гигантов" (с) Ньютон :) В "C++ Templates" Вандевурда и компании есть такой пример: #include template 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...

Комментариев нет:

Отправить комментарий