2014-04-10 13 views
5

Mi chiedo se lo standard C++ 11 dà alcun requisito circa il tipo del std::tuple restituito da std::tie quando alcuni argomenti sono std::ignore.C++: tipo di ritorno di std :: legame con std :: ignorare

Più specificamente, posso supporre che:

  1. decltype(std::tie(42, std::ignore)) non è la stessa decltype(std::tie(std::ignore, 42))
  2. decltype(std::tie(42, std::ignore)) non è la stessa come decltype(std::tie(42))
  3. decltype(std::tie(std::ignore, 42)) non è la stessa come decltype(std::tie(42))
  4. decltype(std::tie(std::ignore, std::ignore)) è non uguale a decltype(std::tie(std::ignore))

In altre parole, dal punto di vista del tipo, la tupla generata si comporta come una tupla che ha tipo decltype(std::ignore) per tutti gli argomenti del modello che corrispondono a std::ignore per posizione?

+0

comportamento non definito? Forse non specificato – Yakk

risposta

4

Sì, è possibile, std::tie restituisce un std::tuple<T&...> dove T... sono i tipi che vengono dati ad esso.
std::ignore ha un tipo non specificato, ma verrà comunque visualizzato nello tuple in base alla posizione in cui è stato specificato in std::tie.

Se se ti fa sentire meglio, si potrebbe includere nel codice da qualche parte:

int n; 
    auto i = std::tie(std::ignore, n); 
    auto j = std::tie(n, std::ignore); 
    auto k = std::tie(n); 
    static_assert(!std::is_same<decltype(i), decltype(j)>::value, ""); 
    static_assert(!std::is_same<decltype(i), decltype(k)>::value, ""); 
    static_assert(!std::is_same<decltype(j), decltype(k)>::value, ""); 

e così via per qualsiasi combinazioni che si sta utilizzando in modo esplicito. In questo modo la compilazione fallirà se la tua ipotesi non è valida.

+0

Quindi, finché non faccio ipotesi sul tipo di std :: ignore, posso trattare tutte quelle tuple sopra come di tipo diverso (ne ho bisogno solo per scopi di specializzazione)? Inoltre, è sicuro inoltrare un 'std :: ignore' usando' decltype (std :: ignore) && 'e' std :: forward', ad es. immagina di creare una sottoclasse di 'std :: tuple'? – eold

+0

@leden Non vedo perché non si possa inoltrare un 'ignore', ma non penso si possa supporre che si possa assegnare ad un altro 'ignore'. – SirGuy

+0

Tre è una contraddizione nel tuo ragionamento, "std :: ignore" essendo non specificati significa in modo specifico che lo Standard non richiede che sia diverso da qualsiasi altro tipo; e quindi sarebbe conforme allo standard per 'std :: ignore' essere' int' (anche se sarebbe stupido) –

Problemi correlati