Компоненты 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&.
Кроме того, многие функции-члены и связанные функции valarray<T> могут быть успешно созданы и будут демонстрировать четко определенное поведение тогда и только тогда, когда T удовлетворяют дополнительным требованиям, указанным для каждого такого члена или связанной функции.
[ Example: Создание экземпляра допустимо valarray<complex>, но operator>() не будет успешно создано для valarray<complex> операндов, так complex как не имеет операторов упорядочивания. ] — end example
Другими словами, типы значений. К ним относятся арифметические типы, указатели, класс библиотеки complexи экземпляры valarray для типов значений.