将一对成员分配给变量

时间:2015-08-03 17:02:56

标签: c++ c++11 c++14

是否可以在不创建临时对象的情况下分配一对成员?

#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来保持&#34;解剖它之前的那一对,但它的创建在实际代码中可能很昂贵。

2 个答案:

答案 0 :(得分:19)

是; 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

live demo

当然你仍然会有一个临时对象某处(模数常量优化),但除非你初始化x和{{{},否则这是你可以编写代码的最直接对象。 1}}直接来自他们的最终值,而不是先在y内创建一对。

答案 1 :(得分:2)

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';
}