Annex C (informative) Compatibility [diff]

C.3 C++ and ISO C++ 2011 [diff.cpp11]

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

C.3.1 Clause [lex]: lexical conventions [diff.cpp11.lex]

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

#define M(x, ...) __VA_ARGS__
int x[2] = { M(1'2,3'4, 5) };
// int x[2] = { 5 };      — C++ 2011
// int x[2] = { 3'4, 5 }; — this International Standard

C.3.2 Clause [basic]: basic concepts [diff.cpp11.basic]

[basic.stc.dynamic.deallocation]
Изменение: Новый обычный (не-размещаемый) деаллокатор.
Обоснование: требуется для освобождения размера.
Влияние на исходную функцию: действующий код C ++ 2011 может объявлять функцию глобального размещения и функцию освобождения следующим образом:

void* operator new(std::size_t, std::size_t);
void operator delete(void*, std::size_t) noexcept;

Однако в этом международном стандарте объявление of operator delete может соответствовать предопределенному обычному (без размещения) operator delete ([basic.stc.dynamic]). Если это так, программа плохо сформирована, как это было для функций распределения членов класса и функций освобождения ([expr.new]).

C.3.3 Clause [expr]: expressions [diff.cpp11.expr]

[expr.cond]
Изменение: условное выражение с выражением throw в качестве второго или третьего операнда сохраняет тип и категорию значения другого операнда.
Обоснование: Ранее санкционированные преобразования (lvalue-to-rvalue, array-to-pointerи function-to-pointer стандартные преобразования), особенно создание временного вследствие Lvalue к Rvalue преобразования, было рассмотрены безвозмездным и удивительно.
Влияние на исходную функцию: действительный код C ++ 2011, который полагается на преобразования, может вести себя по-другому в этом международном стандарте:

struct S {
  int x = 1;
  void mf() { x = 2; }
};
int f(bool cond) {
  S s;
  (cond ? s : throw 0).mf();
  return s.x;
}

В C ++ 2011 f(true) возвращает 1. В этом международном стандарте он возвращается 2.

sizeof(true ? "" : throw 0)

В C ++ 2011 выражение дает sizeof(const char*). В этом международном стандарте он уступает sizeof(const char[1]).

C.3.4 Clause [dcl.dcl]: declarations [diff.cpp11.dcl.dcl]

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

struct S {
  constexpr const int &f();
  int &f();
};

C.3.5 Clause [dcl.decl]: declarators [diff.cpp11.dcl.decl]

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

struct S { // Aggregate in C++ 2014 onwards.
  int m = 1;
};
struct X {
  operator int();
  operator S();
};
X a{};
S b{a};  // uses copy constructor in C++ 2011,
         // performs aggregate initialization in this International Standard

C.3.6 Clause [library]: library introduction [diff.cpp11.library]

[headers]
Изменение: новый заголовок.
Обоснование: новая функциональность.
Влияние на исходную функцию: <shared_­mutex> новый заголовок C ++ . Допустимый код C ++ 2011, который #includeявляется заголовком с таким именем, может быть недопустимым в этом международном стандарте.

C.3.7 Clause [input.output]: input/output library [diff.cpp11.input.output]

[c.files]
Изменение: gets не определено.
Обоснование: использование gets считается опасным.
Влияние на исходную функцию: действительный код C ++ 2011, использующий эту gets функцию, может не соответствовать этому международному стандарту.