В этом подпункте перечислены различия между C ++ и ISO C ++ 2014 (ISO / IEC 14882: 2014, Programming Languages — C++) по главам этого документа.
[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
[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)
[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
[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
[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).
[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
}
[except.spec]
Изменение: удалить спецификации динамических исключений.
Обоснование: спецификации динамических исключений были устаревшей функцией, которая была сложной и неустойчивой в использовании. Они плохо взаимодействовали с системой типов, что стало более серьезной проблемой в этом международном стандарте, где (нединамические) спецификации исключений являются частью типа функции.
Влияние на исходную функцию:
действительное объявление функции C ++ 2014, объявление функции-члена, объявление указателя функции или объявление ссылки на функцию, если оно имеет потенциально генерирующую динамическую спецификацию исключения, будет отклонено в этом международном стандарте как некорректно сформированное. Нарушение спецификации динамического исключения без генерации вызовет, terminate
а не unexpected
может не выполнять раскручивание стека до такого вызова.
[namespace.future]
Изменение: новые зарезервированные пространства имен.
Обоснование: Зарезервируйте пространства имен для будущих версий стандартной библиотеки, которые в противном случае могли бы быть несовместимы с существующими программами.
Влияние на исходную функцию:
глобальные пространства имен, std
за которыми следует произвольная последовательность цифр, зарезервированы для будущей стандартизации. Допустимый код C ++ 2014, который использует такое пространство имен верхнего уровня, например std2, может быть недопустимым в этом международном стандарте.
[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*
[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
[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); }
Изменение:
Шаблоны классов
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, использующая эти идентификаторы, может быть неправильно сформирована в этом международном стандарте.