首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么c++ 'auto‘不能代表多种类型的限制

为什么c++ 'auto‘不能代表多种类型的限制
EN

Stack Overflow用户
提问于 2021-05-17 16:02:33
回答 2查看 169关注 0票数 3

我的意思是,为什么下面的例子不是一个有效的结构:

代码语言:javascript
复制
if (auto x = 2, y = "ab"; x != 0) {
  // ...
}

(在我的实际用例中,调用的是一些函数,而不是2"ab"文本。)

代码语言:javascript
复制
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中扣除autoint,然后报告:"ab"无法初始化int

但是在另一边,它被允许写:

代码语言:javascript
复制
if (auto [x, y] = std::make_pair(2, "ab"); x != 0) {
  // ...
}

在这里,auto代表不同的类型。

除了“为什么”之外,我还想知道是否还有其他的解决办法(除了上面提到的那个)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-17 16:07:39

因此,在这里,

代表不同的类型。

我不会那样解释的。

auto代表std::pair<int, char const*>。但是,这里的特别之处在于,这对名为[a, b],其中ab指的是该对的内部成员。如果语言允许显式地键入这对的类型,我会非常喜欢。

事实上,ab不是变量。它们是结构化绑定,它们的行为略有不同。尽管这种差异在C++20中越来越不明显。

所以,实际上,这里的auto只是一种类型。

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

代码语言:javascript
复制
int x = 0, y = 0;
auto [a, b] = std::tie(x, y);

即使是auto而不是auto&ab都是对xy的引用。尝试使用auto&是行不通的,因为std::tie的结果是一个prvalue。

但是,有些地方只有一个auto可以引用不同的东西。

考虑到这一点:

代码语言:javascript
复制
auto lambda = [](auto... args) { /* ... */ };

在这里,auto...是许多不同的东西,但是auto...auto不同。

票数 4
EN

Stack Overflow用户

发布于 2021-05-17 16:15:02

要使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被推断为一对虎和字符串。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67573252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档