2013-05-23 7 views
14

C++ 11を無視するオブジェクトがstd::ignoreと呼ば紹介:簡潔にするために要件::

const /* unspecified */ ignore; 

、私が言うことができるものから

typedef decltype(std::ignore) T; 

を聞かせて、Tのための唯一の要件は、ということです [C++ 11,20.4.2.4:7]という仕様のため、CopyAssignableです。

g ++ - 4.8では、がさらにDefaultConstructible(たとえば、T x;コンパイル)であることがわかります。この実装定義の動作ですか?

(私が見逃しているT上の他の要件がある場合は、手の込んだしてください。)

+0

http://stackoverflow.com/questions/16227391/please-explain-this-code-that-uses-stdignore –

+2

これは興味深い質問です。その背後にある動機は何ですか? std :: ignoreの目的はタグの一種であるプレースホルダであることは明らかです。特にstd :: tieではそれ以上の用途はありません。 –

+0

実用的なアプリケーションはありません。私は、ユーザが「ダミー」イテレータを圧縮することを可能にする「zip」イテレータ(例えば、ブーストを参照)を作成しています。1つのユースケースは、入力イテレータがzipイテレータで、出力イテレータが(入力の)タプル要素のサブセットを持つzipイテレータである場合、 'std :: copy_if'をサポートしています。 'operator * 'の戻り値が' T '型のオブジェクトを含むタプルに変換可能でなければならないので、' ignore'd要素を持つzipイテレータが 'InputIterator'として使われるとどうなりますか? (恐らく 'DefaultConstructible'は必要以上に強い要求です。) – nknight

答えて

14

標準は、それが区別されるタイプであるという事実以外に、ignoreの種類に要件はありません他のすべてのタイプ。

tieと一緒に使用するときに、標準ライブラリコンテナがignoreが必要な動作を得ることができるようにするすべての機構は、その標準ライブラリの実装に従います。ライブラリには、template<T&> operator=(const T&)の負荷がかかります。また、動作させるために他のメカニズムを使用することもできます。標準は言っていない。したがって、CopyAssignableである必要はありません。

tieは、が具体的にはignoreを使用している場合にのみ特別な動作をすることに注意してください。自分で作成した他の値を使用している場合(タイプに要件がないため、実行できない場合があります)、未定義の動作が発生します。

8

私が言うことができるものから、Tのための唯一の要件は、それが原因std::tie [C++ 11、20.4.2.4:7]の仕様に、CopyAssignableであるということです。

正式には、配置する必要は全くないと思います。 tie()ignoreを引数として受け入れることができるということは、その型の値をタプルに格納しなければならないということを意味するものではありません。実際に起こることはほとんどありそうですが、これは必ずしも正式な仕様。

この実装定義の動作ですか?

実装は(この点を明確にするためのピート・ベッカーのおかげで)、それを文書化する必要がないのでいいえ、動作は、不定です。

+1

いいえ、実装定義の動作ではありません。それは不特定です。言語定義において、「実装定義」とは、適合する実装がその動作を文書化しなければならないことを意味する。 –

+0

@PeteBecker:そうです、ご理解いただきありがとうございます。私は答えを編集した –