我的意思是,为什么下面的例子不是一个有效的结构:
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) {
// ...
}例如,在第一个示例中,VisualC++从第一个2中扣除auto的int,然后报告:"ab"无法初始化int。
但是在另一边,它被允许写:
if (auto [x, y] = std::make_pair(2, "ab"); x != 0) {
// ...
}在这里,auto代表不同的类型。
除了“为什么”之外,我还想知道是否还有其他的解决办法(除了上面提到的那个)。
发布于 2021-05-17 16:07:39
因此,在这里,
代表不同的类型。
我不会那样解释的。
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的结果是一个prvalue。
但是,有些地方只有一个auto可以引用不同的东西。
考虑到这一点:
auto lambda = [](auto... args) { /* ... */ };在这里,auto...是许多不同的东西,但是auto...与auto不同。
发布于 2021-05-17 16:15:02
要使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被推断为一对虎和字符串。
https://stackoverflow.com/questions/67573252
复制相似问题