分配给std :: tie和引用元组有什么区别?

Bar*_*bas 16 c++ tuples reference

我对以下元组业务感到有些困惑:

int testint = 1;
float testfloat = .1f;
std::tie( testint, testfloat ) = std::make_tuple( testint, testfloat );
std::tuple<int&, float&> test = std::make_tuple( testint, testfloat );
Run Code Online (Sandbox Code Playgroud)

有了std::tie它的工作原理,而是直接引用不编译的元组分配,使

"错误:从'std :: tuple <int,float>'转换为非标量类型'std :: tuple <int&,float&>'required"

要么

"没有合适的用户定义的转换,从std :: tuple <int,float>到std :: tuple <int&,float&>"

为什么?我仔细检查了编译器是否真的与通过执行此操作分配的类型相同:

static_assert( std::is_same<decltype( std::tie( testint, testfloat ) ), std::tuple<int&, float&>>::value, "??" );
Run Code Online (Sandbox Code Playgroud)

评估为真.

我也在线查看是否可能是msvc的错误,但是所有编译器都给出了相同的结果.

mas*_*oud 20

双方make_tupletie会演绎由参数返回类型.但是tie会根据演绎的类型制作一个左值引用类型,并且make_tuple会产生一个实际的元组.

std::tuple<int&, float&> a = std::tie( testint, testfloat );

std::tuple<int , float > b = std::make_tuple( testint, testfloat );
Run Code Online (Sandbox Code Playgroud)

 

目标tie是制作一个临时元组,以避免绑定对象的临时副本,不好的效果是,你不能return一个tieif条目对象是本地临时的.


Die*_*ühl 13

std::tie()函数实际初始化了std::tuple<T&...>引用的成员,其中std::tuple<T&...>无法通过templatory初始化std::tuple<T...>.操作std::tie()和初始化相应的对象将表达如下:

std::tuple<int&, float&> test = 
    std::tuple<int&, float&>(testint, testfloat) = std::make_tuple(testint, testfloat);
Run Code Online (Sandbox Code Playgroud)

(显然,您通常会使用与已绑定变量不同的值).