C ++ 11 представляет объект под названием std::ignore
:
const /* unspecified */ ignore;
Для краткости пусть
typedef decltype(std::ignore) T;
Из того, что я могу сказать, единственное требование для T
это то, что это CopyAssignable
из-за спецификации std::tie
[C ++ 11, 20.4.2.4:7].
В g ++ — 4.8 я нахожу, что T
это дополнительно DefaultConstructible
(например., T x;
компилирует). Это поведение, определяемое реализацией?
(Если есть другие требования к T
что я пропустил, пожалуйста, уточните.)
Стандарт имеет нет требования к типу ignore
Кроме того, что это тип, который отличается от всех других типов.
Независимо от механизма, который стандартный контейнер библиотеки делает, чтобы ignore
чтобы получить необходимое поведение при использовании с tie
до этой стандартной реализации библиотеки. Библиотека может дать ему template<T&> operator=(const T&)
перегрузка, или он может использовать какой-то другой механизм, чтобы заставить его работать. Стандарт не говорит. Так что это даже не должно быть CopyAssignable
,
Обратите внимание, что tie
имеет особое поведение, только если вы специально использовать ignore
. Если вы используете какое-то другое значение, созданное вами самим (что, поскольку тип не имеет требований, вы не гарантированно сможете это сделать), вы получите неопределенное поведение.
Из того, что я могу сказать, единственное требование для
T
это то, что этоCopyAssignable
из-за спецификацииstd::tie
[C ++ 11, 20.4.2.4:7].
Формально, я не думаю, что есть какое-либо требование, чтобы быть размещенным. Дело в том, что tie()
может принять ignore
поскольку аргумент не означает, что он должен хранить значение этого типа в кортеже: хотя это, скорее всего, произойдет на практике, я не считаю, что это подразумевается формальной спецификацией.
Это поведение, определяемое реализацией?
Нет, поведение неопределенные, поскольку реализация не обязана документировать ее (спасибо Питу Беккеру за разъяснение этого момента).