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


person nknight    schedule 23.05.2013    source источник
comment
stackoverflow.com/questions/16227391 /   -  person    schedule 23.05.2013
comment
Это интересный вопрос. Какая мотивация стоит за этим? Кажется очевидным, что вся цель std::ignore — быть заполнителем: своего рода тегом. Похоже, что кроме этого он не имеет никакого применения, особенно с std::tie.   -  person Steven Maitlall    schedule 23.05.2013
comment
Нет практического применения. Я делаю итератор zip (см., например, boost), который позволяет пользователю застегивать «фиктивный» итератор. Один вариант использования поддерживает std::copy_if, когда входные итераторы являются zip-итераторами, а выходной итератор — zip-итератором с подмножеством элементов кортежа (входных). Мне было интересно, что произойдет, если итератор zip с элементами ignored будет использоваться как InputIterator, потому что возвращаемое значение operator* должно быть преобразовано в кортеж, содержащий объект типа T. (Возможно, DefaultConstructibleity является более сильным требованием, чем необходимо.)   -  person nknight    schedule 23.05.2013


Ответы (2)


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

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

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

person Nicol Bolas    schedule 23.05.2013

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

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

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

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

person Andy Prowl    schedule 23.05.2013