ruo*_*ola 4 c++ destructuring std-pair c++17 structured-bindings
有没有办法在解构 a 时隐藏现有变量std::pair?例如,如果我定义了以下函数:
#include <iostream>
#include <utility>
std::pair<int, int> returns_pair(int a, int b)
{
return std::make_pair(a * a, b * b);
}
void prints_two_variables(int a, int b)
{
std::cout << a << "\n" << b << "\n";
}
Run Code Online (Sandbox Code Playgroud)
然后这个main函数工作正常,因为我从返回的中创建了新变量std::pair:
int main()
{
int a = 2;
int b = 3;
auto [x, y] = returns_pair(a, b);
prints_two_variables(x, y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Run Code Online (Sandbox Code Playgroud)4 9
但是我不能使用相同的变量名并隐藏现有变量,因为这会尝试再次实际声明它们:
int main()
{
int a = 2;
int b = 3;
auto [a, b] = returns_pair(a, b);
prints_two_variables(a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误:
Run Code Online (Sandbox Code Playgroud)main.cpp: In function ‘int main()’: main.cpp:12:15: error: conflicting declaration ‘auto a’ auto [a, b] = returns_pair(a, b); ^ main.cpp:10:9: note: previous declaration as ‘int a’ int a = 2; ^ main.cpp:12:15: error: conflicting declaration ‘auto b’ auto [a, b] = returns_pair(a, b); ^ main.cpp:11:9: note: previous declaration as ‘int b’ int b = 3; ^
我也试过没有auto,但这给出了一个完全不同的错误:
int main()
{
int a = 2;
int b = 3;
[a, b] = returns_pair(a, b);
prints_two_variables(a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误:
Run Code Online (Sandbox Code Playgroud)main.cpp: In lambda function: main.cpp:12:12: error: expected ‘{’ before ‘=’ token [a, b] = returns_pair(a, b); ^ main.cpp: In function ‘int main()’: main.cpp:12:31: error: no match for ‘operator=’ (operand types are ‘main()::’ and ‘std::pair’) [a, b] = returns_pair(a, b); ^ main.cpp:12:10: note: candidate: main()::& main()::::operator=(const main()::&) [a, b] = returns_pair(a, b); ^ main.cpp:12:10: note: no known conversion for argument 1 from ‘std::pair’ to ‘const main()::&’
有什么办法可以做到这一点吗?
Bar*_*rry 10
有没有办法在隐藏现有变量的同时解构一对?
不可以。结构化绑定声明总是引入标识符,它不能覆盖或分配现有变量。这是格式错误的:
int i = 4;
auto [i] = std::tuple(5);
Run Code Online (Sandbox Code Playgroud)
出于同样的原因,这是格式错误的:
int i = 4;
int i = 5;
Run Code Online (Sandbox Code Playgroud)
如果你想做的是覆盖,你可以使用tie和分配:
std::tie(a, b) = returns_pair(a, b);
Run Code Online (Sandbox Code Playgroud)
这适用于这种情况,但不适用于returns_pair可能返回具有两个公共成员的结构的一般情况。
你想要的是std::tie. 这将创建std::tuple对参数的引用,并允许您将 重新分配pair给创建它的元素。那看起来像
int main()
{
int a = 2;
int b = 3;
std::tie(a, b) = returns_pair(a, b);
prints_two_variables(a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请记住,也#include将<tuple>头,所以你可以使用std::tie。