在 C++ 中解构时如何隐藏现有变量?
How to shadow existing variables when destructuring in C++?
在解构 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";
}
然后这个 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;
}
Output:
4
9
但我不能使用相同的变量名并隐藏现有变量,因为这会尝试再次实际声明它们:
int main()
{
int a = 2;
int b = 3;
auto [a, b] = returns_pair(a, b);
prints_two_variables(a, b);
return 0;
}
Error:
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;
}
Error:
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()::&’
有什么办法可以做到这一点吗?
你要的是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;
}
记得还要 #include
<tuple>
header 这样你就可以使用 std::tie
.
Is there any way to destructure a pair, while shadowing existing variables?
没有。结构化绑定声明总是引入标识符,它不能覆盖或分配现有变量。这是错误的格式:
int i = 4;
auto [i] = std::tuple(5);
出于同样的原因,这是错误的:
int i = 4;
int i = 5;
如果你想做的是覆盖,你可以使用tie
并赋值:
std::tie(a, b) = returns_pair(a, b);
这适用于这种情况,但不适用于 returns_pair
可能 return 具有两个 public 成员的结构的一般情况。
在解构 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";
}
然后这个 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;
}
Output:
4 9
但我不能使用相同的变量名并隐藏现有变量,因为这会尝试再次实际声明它们:
int main()
{
int a = 2;
int b = 3;
auto [a, b] = returns_pair(a, b);
prints_two_variables(a, b);
return 0;
}
Error:
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;
}
Error:
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()::&’
有什么办法可以做到这一点吗?
你要的是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;
}
记得还要 #include
<tuple>
header 这样你就可以使用 std::tie
.
Is there any way to destructure a pair, while shadowing existing variables?
没有。结构化绑定声明总是引入标识符,它不能覆盖或分配现有变量。这是错误的格式:
int i = 4;
auto [i] = std::tuple(5);
出于同样的原因,这是错误的:
int i = 4;
int i = 5;
如果你想做的是覆盖,你可以使用tie
并赋值:
std::tie(a, b) = returns_pair(a, b);
这适用于这种情况,但不适用于 returns_pair
可能 return 具有两个 public 成员的结构的一般情况。