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_tuple并tie会演绎由参数返回类型.但是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)
(显然,您通常会使用与已绑定变量不同的值).