是否可以在不创建临时对象的情况下分配对的成员?
#include <tuple>
using namespace std;
pair< bool, int > foo()
{
return make_pair( false, 3 );
}
int main()
{
int x;
bool y;
auto z = foo();
x = z.second;
y = z.first;
return 0;
}
在上面的代码中,需要对象
auto z
在剖析之前“保存”该对,但在实际代码中创建它可能会很昂贵。
std::tie
就是为此发明的:
#include <tuple>
#include <iostream>
std::pair<bool, int> foo()
{
return std::make_pair(false, 3);
}
int main()
{
int x;
bool y;
std::tie(y, x) = foo();
std::cout << x << ',' << y << '\n';
}
// Output: 3,0
当然,您仍然会有一个临时对象somewhere(模常量优化),但这是您可以编写代码的最直接的方法,除非您直接从最终值而不是首先初始化
x
和y
在 foo()
内创建一对。
C++17 已经允许您使用结构化绑定声明语法:
#include <iostream>
std::pair<bool, int> foo() {
return std::make_pair(false, 3);
}
int main() {
auto [y, x] = foo(); //Structured binding attribution
std::cout << x << ',' << y << '\n';
}
我同意建筑师的观点。但是,如果您使用的是 C++17,那么您也可以在 return 语句中删除 make_pair,转而采用更具可读性的 结构化绑定。
#include <iostream>
std::pair<bool, int> foo() {
return {false, 3}; // <- structured binding
}
int main() {
auto [y, x] = foo(); // structured binding attribution
std::cout << x << ',' << y << '\n';
}