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

326
20 октября 2017, 14:42

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

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

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

Answer 1

В конце стандарта есть приложение "Совместимость", в котором перечислены все несовместимости с предыдущими стандартами.

Раздел про совместимость текущего стандарта и С++03

Несовместимостей много. Вот первая по списку:

#define u8 "abc"
const char* s = u8"def";        // Раньше "abcdef", теперь "def"
Answer 2

Я не такой талант, чтоб придумать настолько тонкое свое, так что "постою на плечах гигантов" (с) Ньютон :)

В "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...

READ ALSO
Отображение файлов на память

Отображение файлов на память

Дано два файла, нужно переписать содержимое одного в другойПри этом надо переписывать по 1024 байта

400
Перегрузка опертора [] c++ для создания двумерного массива

Перегрузка опертора [] c++ для создания двумерного массива

Есть класс, который хранит в себе двумерный массив QVector(Аналог std::vector в Qt)

269
помогите с с++ пж [требует правки]

помогите с с++ пж [требует правки]

Вставьте в двумерный массив столбец из нулей после столбца с номером KKВ первой строке даны числа NN, MM и KK (1≤N,M,K≤5001≤N,M,K≤500; K≤MK≤M) — количество...

305