29 Numerics library [numerics]

29.3 Numeric type requirements [numeric.requirements]

Компоненты complex и valarray параметризуются типом информации, которую они содержат и которыми управляют. Программа на C ++ должна создавать экземпляры этих компонентов только с типом, T который удовлетворяет следующим требованиям:267

  • T не является абстрактным классом (у него нет чистых виртуальных функций-членов);

  • T не является ссылочным типом;

  • T не имеет cv-квалификации;

  • Если T это класс, у него есть общедоступный конструктор по умолчанию;

  • Если T это класс, у него есть общедоступный конструктор копии с подписью T​::​T(const T&)

  • Если T это класс, у него есть открытый деструктор;

  • Если T это класс, то есть оператор общественного назначения , чья подпись либо T& T​::​operator=(const T&) или T& T​::​operator=(T)

  • Если T это класс, его оператор присваивания, конструкторы копирования и по умолчанию, а также деструктор должны соответствовать друг другу в следующем смысле:

    • Инициализация необработанного хранилища с использованием конструктора копирования для значения, независимо от T()полученного, семантически эквивалентна инициализации значения того же необработанного хранилища.

    • Инициализация необработанного хранилища с использованием конструктора по умолчанию с последующим назначением семантически эквивалентна инициализации необработанного хранилища с использованием конструктора копирования.

    • Уничтожение объекта с последующей инициализацией его необработанного хранилища с помощью конструктора копирования семантически эквивалентно назначению исходному объекту.

    [ Note: Это правило частично заявляет, что не должно быть никаких тонких различий в семантике инициализации и присваивания. Это дает реализации значительную гибкость в инициализации массивов.

    [ Example: Реализация может инициализировать a valarray путем выделения памяти с помощью new оператора (что подразумевает вызов конструктора по умолчанию для каждого элемента) и последующего присвоения каждому элементу его значения. Или реализация может выделить необработанное хранилище и использовать конструктор копирования для инициализации каждого элемента. ]end example

    Если различие между инициализацией и присваиванием важно для класса или если он не удовлетворяет любому из других условий, перечисленных выше, программист должен использовать vector вместо этого valarray для этого класса. ] end note

  • Если T это класс, он не перегружает унарный operator&.

Если какая-либо операция T вызывает исключение, эффекты не определены.

Кроме того, многие функции-члены и связанные функции valarray<T> могут быть успешно созданы и будут демонстрировать четко определенное поведение тогда и только тогда, когда T удовлетворяют дополнительным требованиям, указанным для каждого такого члена или связанной функции.

[ Example: Создание экземпляра допустимо valarray<complex>, но operator>() не будет успешно создано для valarray<complex> операндов, так complex как не имеет операторов упорядочивания. ]end example

Другими словами, типы значений. К ним относятся арифметические типы, указатели, класс библиотеки complexи экземпляры valarray для типов значений.