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