В этом подпункте перечислены различия между C ++ и ISO C ++ 2011 (ISO / IEC 14882: 2011, Programming Languages — C++) по главам этого документа.
[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
[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]).
[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]).
[dcl.constexpr]
Изменение: constexpr нестатические функции-члены не являются неявно
const функциями-членами.
Обоснование: необходимо, чтобы constexpr функции-члены могли изменять объект.
Влияние на исходную функцию:
действительный код C ++ 2011 может не соответствовать этому международному стандарту. Например, следующий код действителен в C ++ 2011, но недействителен в этом международном стандарте, поскольку он дважды объявляет одну и ту же функцию-член с разными типами возврата:
struct S { constexpr const int &f(); int &f(); };
[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
[headers]
Изменение: новый заголовок.
Обоснование: новая функциональность.
Влияние на исходную функцию: <shared_mutex> новый
заголовок C ++ . Допустимый код C ++ 2011, который #includeявляется заголовком с таким именем, может быть недопустимым в этом международном стандарте.
[c.files]
Изменение: gets не определено.
Обоснование: использование gets считается опасным.
Влияние на исходную функцию:
действительный код C ++ 2011, использующий эту gets функцию, может не соответствовать этому международному стандарту.