Annex C (informative) Compatibility [diff]

C.4 C++ and ISO C++ 2014 [diff.cpp14]

В этом подпункте перечислены различия между C ++ и ISO C ++ 2014 (ISO / IEC 14882: 2014, Programming Languages — C++) по главам этого документа.

C.4.1 Clause [lex]: lexical conventions [diff.cpp14.lex]

[lex.phases]
Изменение: Удаление поддержки триграфа как обязательной функции.
Обоснование: предотвращает случайное использование триграфов в необработанных строковых литералах и комментариях.
Влияние на исходную функцию: действительный код C ++ 2014, в котором используются триграфы, может быть недействительным или может иметь другую семантику в этом международном стандарте. Реализации могут выбрать перевод триграфов, как указано в C ++ 2014, если они появляются за пределами необработанного строкового литерала, как часть определяемого реализацией сопоставления символов физического исходного файла с базовым исходным набором символов.

[lex.ppnumber]
Изменение: pp-number может содержать и . Обоснование: необходимо включить шестнадцатеричные плавающие литералы. Влияние на исходную функцию: действительный код C ++ 2014 может не компилироваться или давать другие результаты в соответствии с этим международным стандартом. В частности, последовательности символов, такие как и, представляют собой три отдельных токена каждая в C ++ 2014, но один единственный токен в этом международном стандарте. p signP sign

0p+0 0e1_­p+0

#define F(a) b ## a
int b0p = F(0p+0);  // ill-formed; equivalent to “int b0p = b0p + 0;” in C++ 2014

C.4.2 Clause [expr]: expressions [diff.cpp14.expr]

[expr.post.incr], Изменение: удалить оператор приращения с операндом. Обоснование: устаревшая функция с иногда неожиданной семантикой. Влияние на исходную функцию: допустимое выражение C ++ 2014, использующее оператор приращения для lvalue, неправильно сформировано в этом международном стандарте. Обратите внимание, что это может произойти, если lvalue имеет тип, заданный параметром шаблона. [expr.pre.incr]
bool

bool

[expr.new], Изменение: Механизм динамического выделения для чрезмерно выровненных типов. Обоснование: упростить использование чрезмерно выровненных типов. Влияние на исходную функцию: в C ++ 2014 код, который использует a для выделения объекта с чрезмерно выровненным типом класса, где этот класс не имеет собственных функций распределения, используется для выделения памяти. В этом международном стандарте вместо него используется. [expr.delete]


new-expression​::​operator new(std​::​size_­t)​::​operator new(std​::​size_­t, std​::​align_­val_­t)

C.4.3 Clause [dcl.dcl]: declarations [diff.cpp14.dcl.dcl]

[dcl.stc]
Изменение: удаление . Обоснование: разрешить повторное использование устаревшего ключевого слова в будущих версиях этого международного стандарта. Влияние на исходную функцию: действительное объявление C ++ 2014, в котором используется символ, неверно сформулировано в этом международном стандарте. Спецификатор можно просто удалить, чтобы сохранить исходное значение. register storage-class-specifier

register storage-class-specifier

[dcl.spec.auto]
Изменение: auto вычет из braced-init-list.
Обоснование: более интуитивное поведение дедукции.
Влияние на исходную функцию: действительный код C ++ 2014 может не компилироваться или может изменить значение в этом международном стандарте. Например:

auto x1{1};    // was std​::​initializer_­list<int>, now int
auto x2{1, 2}; // was std​::​initializer_­list<int>, now ill-formed

C.4.4 Clause [dcl.decl]: declarators [diff.cpp14.decl]

[dcl.fct]
Изменение: сделайте спецификации исключений частью системы типов.
Обоснование: повышение безопасности типов.
Влияние на исходную функцию: действительный код C ++ 2014 может не скомпилировать или изменить значение в этом международном стандарте:

void g1() noexcept;
void g2();
template<class T> int f(T *, T *);
int x = f(g1, g2);    // ill-formed; previously well-formed

[dcl.init.aggr]
Изменение: определение агрегата расширено для применения к определяемым пользователем типам с базовыми классами.
Обоснование: для повышения удобства инициализации агрегата.
Влияние на исходную функцию: действительный код C ++ 2014 может не компилироваться или давать другие результаты в соответствии с настоящим международным стандартом; инициализация из пустого списка инициализаторов будет выполнять агрегатную инициализацию вместо вызова конструктора по умолчанию для затронутых типов:

struct derived;
struct base {
  friend struct derived;
private:
  base();
};
struct derived : base {};

derived d1{};       // Error. The code was well-formed before.
derived d2;         // still OK

C.4.5 Clause [special]: special member functions [diff.cpp14.special]

[class.inhctor.init]
Изменение: при наследовании конструктора конструктор больше не внедряется в производный класс.
Обоснование: лучшее взаимодействие с другими языковыми функциями.
Влияние на исходную функцию: действительный код C ++ 2014, в котором используются наследующие конструкторы, может быть недействительным или иметь другую семантику. A, using-declaration который называет конструктор, теперь делает соответствующие конструкторы базового класса видимыми для инициализации производного класса, а не объявляет дополнительные конструкторы производного класса.

struct A {
  template<typename T> A(T, typename T::type = 0);
  A(int);
};
struct B : A {
  using A::A;
  B(int);
};
B b(42L); // now calls B(int), used to call B<long>(long),
          // which called A(int) due to substitution failure
          // in A<long>(long).

C.4.6 Clause [temp]: templates [diff.cpp14.temp]

[temp.deduct.type]
Изменение: возможность выводить из типа аргумента шаблона, не являющегося типом.
Обоснование: в сочетании с возможностью объявлять аргументы шаблона, не являющиеся типом, с типами-заполнителями, позволяет частичным специализациям разлагаться на основе типа, выведенного для аргумента шаблона, не являющегося типом.
Влияние на исходную функцию: действительный код C ++ 2014 может не компилироваться или давать другие результаты в соответствии с этим международным стандартом:

template <int N> struct A;
template <typename T, T N> int foo(A<N> *) = delete;
void foo(void *);
void bar(A<0> *p) {
  foo(p); // ill-formed; previously well-formed
}

C.4.7 Clause [except]: exception handling [diff.cpp14.except]

[except.spec]
Изменение: удалить спецификации динамических исключений.
Обоснование: спецификации динамических исключений были устаревшей функцией, которая была сложной и неустойчивой в использовании. Они плохо взаимодействовали с системой типов, что стало более серьезной проблемой в этом международном стандарте, где (нединамические) спецификации исключений являются частью типа функции.
Влияние на исходную функцию: действительное объявление функции C ++ 2014, объявление функции-члена, объявление указателя функции или объявление ссылки на функцию, если оно имеет потенциально генерирующую динамическую спецификацию исключения, будет отклонено в этом международном стандарте как некорректно сформированное. Нарушение спецификации динамического исключения без генерации вызовет, terminate а не unexpected может не выполнять раскручивание стека до такого вызова.

C.4.8 Clause [library]: library introduction [diff.cpp14.library]

[namespace.future]
Изменение: новые зарезервированные пространства имен.
Обоснование: Зарезервируйте пространства имен для будущих версий стандартной библиотеки, которые в противном случае могли бы быть несовместимы с существующими программами.
Влияние на исходную функцию: глобальные пространства имен, std за которыми следует произвольная последовательность цифр, зарезервированы для будущей стандартизации. Допустимый код C ++ 2014, который использует такое пространство имен верхнего уровня, например std2, может быть недопустимым в этом международном стандарте.

C.4.9 Clause [utilities]: general utilities library [diff.cpp14.utilities]

[func.wrap]
Изменение: удалены конструкторы, использующие распределители.
Обоснование: Нет консенсуса по реализации.
Влияние на исходную функцию: действительный код C ++ 2014 может не компилироваться или может изменить значение в этом международном стандарте. В частности, построение std​::​function с помощью распределителя плохо сформировано, и конструкция uses-allocator не передает распределитель std​::​function конструкторам в этом международном стандарте.

[util.smartptr.shared]
Изменение: другое ограничение на конверсии из unique_­ptr.
Обоснование: добавление поддержки массивов с shared_­ptrпомощью синтаксиса shared_­ptr<T[]> и shared_­ptr<T[N]>.
Влияние на исходную функцию: действительный код C ++ 2014 может не компилироваться или может изменить значение в этом международном стандарте. Например:

#include <memory>
std::unique_ptr<int[]> arr(new int[1]);
std::shared_ptr<int> ptr(std::move(arr)); // error: int(*)[] is not compatible with int*

C.4.10 Clause [strings]: strings library [diff.cpp14.string]

[basic.string]
Изменение: .data() добавлен неконстантный член.
Обоснование: Отсутствие неконстантного .data() отличия от аналогичного члена std​::​vector. Это изменение упорядочивает поведение данного международного стандарта.
Влияние на исходную функцию: перегруженные функции с разными путями кода char* и const char* аргументами будут выполняться по-разному при вызове с неконстантным строковым .data() членом в этом международном стандарте.

int f(char *) = delete;
int f(const char *);
string s;
int x = f(s.data()); // ill-formed; previously well-formed

C.4.11 Clause [containers]: containers library [diff.cpp14.containers]

[associative.reqmts]
Изменение: Изменение требований:
Обоснование: Повышение переносимости, уточнение требований к ассоциативному контейнеру.
Влияние на исходную функцию: действительный код C ++ 2014, который пытается использовать ассоциативные контейнеры, имеющие объект сравнения с неконстантным оператором вызова функции, может не компилироваться в этом международном стандарте:

#include <set>

struct compare
{
  bool operator()(int a, int b)
  {
    return a < b;
  }
};

int main() {
  const std::set<int, compare> s;
  s.find(0);
}

C.4.12 Annex [depr]: compatibility features [diff.cpp14.depr]


Изменение: Шаблоны классов auto_­ptr, unary_­functionи binary_­function, функциональные шаблоны random_­shuffle, и шаблоны функций (и их возвращаемые типы) ptr_­fun, mem_­fun, mem_­fun_­ref, bind1st, и bind2nd не определены.
Обоснование: заменены новыми функциями.
Влияние на исходную функцию: действительный код C ++ 2014, использующий эти шаблоны классов и шаблоны функций, может не соответствовать этому международному стандарту.


Изменение: удалить старые члены iostreams [depr.ios.members].
Обоснование: Избыточная функция для совместимости с предварительно стандартным кодом отслужила свое время.
Влияние на исходную функцию: действующая программа C ++ 2014, использующая эти идентификаторы, может быть неправильно сформирована в этом международном стандарте.