gpt4 book ai didi

c++ - 为什么 C++ 不允许在一个 auto 语句中使用多种类型?

转载 作者:IT老高 更新时间:2023-10-28 23:00:24 30 4
gpt4 key购买 nike

2011 年的 C++ 标准引入了新的关键字 auto,可用于定义变量而不是类型,即

auto p=make_pair(1,2.5);                   // pair<int,double>
auto i=std::begin(c), end=std::end(c); // decltype(std::begin(c))

在第二行中,iend 属于同一类型,称为auto。标准不允许

auto i=std::begin(container), e=std::end(container), x=*i;

x 将是不同的类型。 我的问题:为什么标准不允许最后一行?可以通过将 auto 解释为不是表示某些待推导的类型,而是表示 any 变量的类型声明为 auto应从其指定值中扣除。 C++11 标准是否有充分的理由不遵循这种方法?

这其实有一个用例,即在for循环的初始化语句中:

for(auto i=std::begin(c), end=std::end(c), x=*i;  i!=end;  ++i, x+=*i)
{ ... }

当变量 iendx 的范围仅限于 for 循环时。 AFAIK,除非这些变量具有通用类型,否则这无法在 C++ 中实现。 这是正确的吗?(将所有类型放入 struct 的丑陋技巧除外)

在一些可变参数模板应用程序中也可能存在用例。

最佳答案

我认为这只是与非auto声明的一致性问题。

这个:

auto n = 42, *p = &n;

相当于:

int n = 42, *p = &n;

类型 intint* 是从初始化器派生的。在这两种情况下,尽管 intint* 是不同的类型,但由于它们的句法关系密切,它们被允许在同一个声明中。 (根据 C 和 C++ 声明 几乎 遵循的“声明遵循使用”规则,您将 n*p 定义为输入 int。)

本来可以在同一个声明中允许不相关的类型:

auto n = 42, x = 1.5;

但以上必须等同于两个单独的声明:

int n = 42; double x = 1.5;

我认为添加 auto 的想法是对语言进行最小的更改,允许从初始值设定项推断类型,但不更改可能的声明类型。

即使没有 auto,您也可以在 for 循环头中定义 intint*:

for (int n = 42, *p = &n; expr1; expr2) { /* ... / }

但您不能同时声明 intdoubleauto 的添加并没有改变这一点。

for 循环的上下文之外,无论如何使用单独的声明通常要好得多。在大多数情况下,将大量不同的声明放入 for 循环可能是个坏主意。对于需要大量声明的(可能很少见)情况,您可以将它们放在循环之上,如下所示:

auto i=std::begin(c), end=std::end(c),
for( x=*i; i!=end; ++i, x+=*i) {
// ...
}

如果您想限制范围,请在整个内容周围添加另一组 { }。 (在这种情况下,您可能希望 end 仍然是 const。)

关于c++ - 为什么 C++ 不允许在一个 auto 语句中使用多种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19707013/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com