为什么有一个限制,c++ 'auto' 不能代表多种类型
Why there is a limitation that c++ 'auto' cannot stand for multiple types
我的意思是,为什么下面的例子不是一个有效的结构:
if (auto x = 2, y = "ab"; x != 0) {
// ...
}
(在我的实际用例中,调用了一些函数而不是 2
和 "ab"
文字。)
或
std::vector<int> cont1;
std::vector<char> cont2;
for (auto it1 = cont1.begin(), it2 = cont2.begin(); it1 != cont1.end() && it2 != cont2.end(); ++it1, ++it2) {
// ...
}
似乎例如在第一个示例中,Visual C++ 从第一个 2
推导出 auto
的 int
,然后报告:"ab"
无法初始化 int
。
但是在另一边可以这样写:
if (auto [x, y] = std::make_pair(2, "ab"); x != 0) {
// ...
}
所以在这里,auto
代表不同的类型。
除了“为什么”的答案,我想知道是否还有其他解决方法(我上面的解决方法除外)。
So here, auto
stands for different types.
我不会那样解释。
auto
代表std::pair<int, char const*>
。然而,这里的特殊之处在于对的名称是 [a, b]
,其中 a
和 b
指的是对中的内部成员。如果该语言允许明确输入对的类型,我真的很想。
事实上,a
和b
是不是变量。它们是结构化绑定,并且它们的行为有点不同。尽管这种差异在 C++20 中变得不那么明显了。
真的,这里的auto
只有一种
另一种证明我观点的方法是:
int x = 0, y = 0;
auto [a, b] = std::tie(x, y);
尽管它是 auto
而不是 auto&
,但 a
和 b
是对 x
和 y
的引用。并且尝试使用 auto&
将不起作用,因为 std::tie
的结果是纯右值。
但是,有些地方只有一个 auto
可能指的是不同的东西。
考虑一下:
auto lambda = [](auto... args) { /* ... */ };
在这里,auto...
是很多不同的东西,但是auto...
不同于auto
。
要使 auto
正常工作,编译器需要能够在您不明确告知的情况下推断出变量的类型。
当你写 foo x,y
时,你告诉编译器变量 x
和 y
都是 foo
.
类型
当您编写 auto a,b
时,您是在告诉编译器它应该将变量 a
和 b
推断为同一类型。但是编译器在这种情况下不会进行隐式转换。因此,您不能使用 auto
,即使它具有逻辑意义(例如 auto a = 2.0, b = 2;
)。
允许不同的类型,当这种语法通常明确请求相同的类型时可能会导致严重的错误。
此外,auto [x, y] = std::make_pair(2, "ab")
- 这里的 auto
并不代表不同的类型。 auto
被推断为一对整数和字符串。
我的意思是,为什么下面的例子不是一个有效的结构:
if (auto x = 2, y = "ab"; x != 0) {
// ...
}
(在我的实际用例中,调用了一些函数而不是 2
和 "ab"
文字。)
或
std::vector<int> cont1;
std::vector<char> cont2;
for (auto it1 = cont1.begin(), it2 = cont2.begin(); it1 != cont1.end() && it2 != cont2.end(); ++it1, ++it2) {
// ...
}
似乎例如在第一个示例中,Visual C++ 从第一个 2
推导出 auto
的 int
,然后报告:"ab"
无法初始化 int
。
但是在另一边可以这样写:
if (auto [x, y] = std::make_pair(2, "ab"); x != 0) {
// ...
}
所以在这里,auto
代表不同的类型。
除了“为什么”的答案,我想知道是否还有其他解决方法(我上面的解决方法除外)。
So here,
auto
stands for different types.
我不会那样解释。
auto
代表std::pair<int, char const*>
。然而,这里的特殊之处在于对的名称是 [a, b]
,其中 a
和 b
指的是对中的内部成员。如果该语言允许明确输入对的类型,我真的很想。
事实上,a
和b
是不是变量。它们是结构化绑定,并且它们的行为有点不同。尽管这种差异在 C++20 中变得不那么明显了。
真的,这里的auto
只有一种
另一种证明我观点的方法是:
int x = 0, y = 0;
auto [a, b] = std::tie(x, y);
尽管它是 auto
而不是 auto&
,但 a
和 b
是对 x
和 y
的引用。并且尝试使用 auto&
将不起作用,因为 std::tie
的结果是纯右值。
但是,有些地方只有一个 auto
可能指的是不同的东西。
考虑一下:
auto lambda = [](auto... args) { /* ... */ };
在这里,auto...
是很多不同的东西,但是auto...
不同于auto
。
要使 auto
正常工作,编译器需要能够在您不明确告知的情况下推断出变量的类型。
当你写 foo x,y
时,你告诉编译器变量 x
和 y
都是 foo
.
当您编写 auto a,b
时,您是在告诉编译器它应该将变量 a
和 b
推断为同一类型。但是编译器在这种情况下不会进行隐式转换。因此,您不能使用 auto
,即使它具有逻辑意义(例如 auto a = 2.0, b = 2;
)。
允许不同的类型,当这种语法通常明确请求相同的类型时可能会导致严重的错误。
此外,auto [x, y] = std::make_pair(2, "ab")
- 这里的 auto
并不代表不同的类型。 auto
被推断为一对整数和字符串。