2016-04-25 24 views
17

Gibt es einen semantischen Unterschied zwischen dem Ausdruck SchreibenWas ist der Unterschied zwischen std :: tie und std :: make_tuple mit std :: ref-Argumenten?

std::tie(x, y, z) 

und dem folgenden Ausdrucks?

std::make_tuple(std::ref(x), std::ref(y), std::ref(z)) 

Wenn ja, was sind die Unterschiede?

By the way, diese Frage zu stellen ist nicht das gleiche wie What is the difference between assigning to std::tie and tuple of references? weil die Tupel von Referenzen über std::ref nicht erstellt wird, sondern durch die Art explizit angeben.

Antwort

15

Es gibt fast & Dolch; kein Funktionsunterschied zwischen den beiden Ausdrücken. tie() ist nur kürzer, während make_tuple() ist allgemeiner.


Nach [tuple.creation] make_tuple tut:

template<class... Types> 
constexpr tuple<VTypes...> make_tuple(Types&&... t); 

Uidecay_t<Ti> in Typen für jede Ti sein lassen. Dann ist jede Vi in X&, wenn Ui gleich reference_wrapper<X> ist, ansonsten Vi ist Ui.

std::make_tuple(std::ref(x), std::ref(y), std::ref(z)) Daher ergibt & Dagger; a std::tuple<X&, Y&, Z&>.

Auf der anderen Seite, tie tut:

template<class... Types> 
constexpr tuple<Types&...> tie(Types&... t) noexcept; 

Returns:tuple<Types&...>(t...). Wenn ein Argument in tignore ist, hat das Zuweisen eines beliebigen Werts zum entsprechenden Tupelelement keine Auswirkung.

Daher ergibt std::tie(x, y, z) auch eine std::tuple<X&, Y&, Z&>.


& dolger; Außer in einem edge case.

14

Es gibt einen Unterschied, wenn ein x, y und z eine Spezialisierung von std::reference_wrapper ist.

#include <tuple> 
#include <functional> 

void f(std::reference_wrapper<int> x, int y, int z) 
{ 
    std::tie(x,y,z); // type is std::tuple<std::reference_wrapper<int>&, int&, int&> 
    std::make_tuple(std::ref(x),std::ref(y),std::ref(z)); // type is std::tuple<int&, int&, int&> 
} 
Verwandte Themen