将一对成员分配给变量

问题描述 投票:0回答:3

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

#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
在剖析之前“保存”该对,但在实际代码中创建它可能会很昂贵。

c++ c++11 c++14
3个回答
32
投票

是的;

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()
内创建一对。


13
投票

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

3
投票

我同意建筑师的观点。但是,如果您使用的是 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';
}
© www.soinside.com 2019 - 2024. All rights reserved.