Требования к std :: ignore

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 что я пропустил, пожалуйста, уточните.)

14

Решение

Стандарт имеет нет требования к типу ignoreКроме того, что это тип, который отличается от всех других типов.

Независимо от механизма, который стандартный контейнер библиотеки делает, чтобы ignore чтобы получить необходимое поведение при использовании с tie до этой стандартной реализации библиотеки. Библиотека может дать ему template<T&> operator=(const T&) перегрузка, или он может использовать какой-то другой механизм, чтобы заставить его работать. Стандарт не говорит. Так что это даже не должно быть CopyAssignable,

Обратите внимание, что tie имеет особое поведение, только если вы специально использовать ignore. Если вы используете какое-то другое значение, созданное вами самим (что, поскольку тип не имеет требований, вы не гарантированно сможете это сделать), вы получите неопределенное поведение.

14

Другие решения

Из того, что я могу сказать, единственное требование для T это то, что это CopyAssignableиз-за спецификации std::tie [C ++ 11, 20.4.2.4:7].

Формально, я не думаю, что есть какое-либо требование, чтобы быть размещенным. Дело в том, что tie() может принять ignore поскольку аргумент не означает, что он должен хранить значение этого типа в кортеже: хотя это, скорее всего, произойдет на практике, я не считаю, что это подразумевается формальной спецификацией.

Это поведение, определяемое реализацией?

Нет, поведение неопределенные, поскольку реализация не обязана документировать ее (спасибо Питу Беккеру за разъяснение этого момента).

8

По вопросам рекламы [email protected]