为什么有一个限制,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 推导出 autoint,然后报告:"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],其中 ab 指的是对中的内部成员。如果该语言允许明确输入对的类型,我真的很想。

事实上,ab不是变量。它们是结构化绑定,并且它们的行为有点不同。尽管这种差异在 C++20 中变得不那么明显了。

真的,这里的auto只有一种

另一种证明我观点的方法是:

int x = 0, y = 0;
auto [a, b] = std::tie(x, y);

尽管它是 auto 而不是 auto&,但 ab 是对 xy 的引用。并且尝试使用 auto& 将不起作用,因为 std::tie 的结果是纯右值。


但是,有些地方只有一个 auto 可能指的是不同的东西。

考虑一下:

auto lambda = [](auto... args) { /* ... */ };

在这里,auto...是很多不同的东西,但是auto...不同于auto

要使 auto 正常工作,编译器需要能够在您不明确告知的情况下推断出变量的类型。

当你写 foo x,y 时,你告诉编译器变量 xy 都是 foo.

类型

当您编写 auto a,b 时,您是在告诉编译器它应该将变量 ab 推断为同一类型。但是编译器在这种情况下不会进行隐式转换。因此,您不能使用 auto,即使它具有逻辑意义(例如 auto a = 2.0, b = 2;)。

允许不同的类型,当这种语法通常明确请求相同的类型时可能会导致严重的错误。


此外,auto [x, y] = std::make_pair(2, "ab") - 这里的 auto 并不代表不同的类型。 auto 被推断为一对整数和字符串。