2013-05-23 21 views
14

C++ 11 introduce un oggetto chiamato std::ignore:Requisiti per std :: ignorano

const /* unspecified */ ignore; 

Per brevità, diamo

typedef decltype(std::ignore) T; 

Da quello che posso dire, l'unico requisito per T è che è CopyAssignable, a causa delle specifiche di std::tie [C++ 11, 20.4.2.4:7].

In g ++ - 4.8, trovo che T è inoltre DefaultConstructible (ad esempio, T x; compila). Questo comportamento definito dall'implementazione?

(Se non ci sono altri requisiti di T che ho perso, si prega di elaborare.)

+0

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

+2

Questa è una domanda interessante. Qual è la motivazione dietro di esso? Sembra chiaro che l'intero scopo di std :: ignore sia quello di essere un segnaposto: una sorta di tag. Non sembra avere alcun uso oltre a quello, in particolare con std :: tie. –

+0

Nessuna applicazione pratica. Sto facendo un iteratore "zip" (vedi, per esempio, boost) che consente all'utente di comprimere un iteratore "fittizio".Un caso d'uso supporta 'std :: copy_if' quando gli iteratori di input sono zip iterator e l'iteratore di output è un iteratore di zip con un sottoinsieme degli elementi di tupla (degli input). Mi chiedevo cosa sarebbe successo se un iteratore zip con elementi 'ignore'd fosse usato come un' InputIterator', perché il valore restituito da 'operator *' deve essere convertibile in una tupla contenente un oggetto di tipo 'T'. (Forse 'DefaultConstructible'ity è un requisito più forte del necessario.) – nknight

risposta

14

Lo standard ha non requisiti sul tipo di ignore, oltre al fatto che si tratta di un tipo che è distinta da tutti gli altri tipi.

Qualsiasi sia il meccanismo utilizzato da un contenitore di librerie standard per consentire a ignore di ottenere il comportamento richiesto quando utilizzato con tie, è fino all'implementazione di tale libreria standard. La libreria può dargli un sovraccarico template<T&> operator=(const T&) o potrebbe utilizzare qualche altro meccanismo per farlo funzionare. Lo standard non dice. Quindi non deve nemmeno essere CopyAssignable.

Nota che tie ha solo il comportamento speciale se si specificamente utilizzare ignore. Se usi qualche altro valore, creato da te stesso (che, dal momento che il tipo non ha requisiti, non ti garantisce di essere in grado di farlo), otterrai un comportamento indefinito.

8

Da quello che posso dire, l'unico requisito per T è che è CopyAssignable, grazie alla specifica di std::tie [C++ 11, 20.4.2.4:7].

Formalmente, non penso che ci sia alcun requisito in fase di inserimento. Il fatto che tie() possa accettare come argomento l'argomento ignore non significa che debba memorizzare un valore di tale tipo nella tupla: sebbene sia più probabile che ciò accada nella pratica, non lo vedo come implicitamente implicito specifica.

È un comportamento definito dall'implementazione?

No, il comportamento è non specificato, dal momento che l'attuazione non è tenuto a documentare (grazie a Pete Becker per chiarire questo punto).

+1

No, non è un comportamento definito dall'implementazione. Non è specificato Nella definizione del linguaggio, "implementazione definita" significa che un'implementazione conforme deve documentare il suo comportamento. –

+0

@PeteBecker: hai ragione, grazie per il chiarimento. Ho modificato la risposta –