Требования к std:: ignore - программирование
Подтвердить что ты не робот

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

С++ 11 вводит объект с именем std::ignore:

const /* unspecified */ ignore;

Для краткости пусть

typedef decltype(std::ignore) T; 

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

В g++ - 4.8 я обнаружил, что T дополнительно DefaultConstructible (например, T x; компиляции). Это поведение, определяемое реализацией?

(Если есть другие требования к T, которые я пропустил, пожалуйста, уточните.)

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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