为什么自动说明符的类型推导仅关注for-loop的init字段?

时间:2016-07-20 08:40:12

标签: c++ c++11 auto type-deduction

以下示例似乎非常简单明了:

void ftest(size_t& arg)
{
    std::cout << arg << '\n';
}


int main()
{
    size_t max = 5;
    for (auto i = 0; i < max; ++i)
        ftest(i);
} 

但它不会编译(至少使用VS2013)因为 i 推断为 int 而不是 size_t 。问题是 - 如果它不能依赖条件字段,那么这种for循环中 auto 的意义何在?如果编译分析整个陈述并给出预期结果而不是我们现在拥有的东西,那会难过而且耗费时间吗?

3 个答案:

答案 0 :(得分:12)

因为变量的类型是在声明时(从其初始化器)确定的,所以它与如何使用它没有关系。如果需要,将考虑类型转换。该规则与使用明确指定的类型声明的变量相同,auto只是帮助您推断出类型,它并不特殊。

试着考虑一下:

auto max = 5u;
for (auto i = 0; i < max; ++i)
//               ~~~~~~~~
//               i should be unsigned int, or max should be int ?

BTW:如果您希望条件字段max确定类型,则可以使用decltype

for (decltype(max) i = 0; i < max; ++i)

答案 1 :(得分:6)

关键字autofor语句的其余部分无关,也不知道它。如果您说它应该从max推断,那么您说延迟类型扣除,这将不符合auto类型推断规则。

另外,这个怎么样?

  size_t max = 5;
  short min = 1;
  for (auto i = 0; i < max && i > min; ++i)

它应该推断为short还是size_t?你不能让编译器读懂你的想法!

此外,这种延迟推理规则(如果有的话)会使模板元编程变得复杂。

答案 2 :(得分:6)

您实际上提供了一个非常简单的案例,其中条件是一个简单的i < max,其中max的类型是已知的。该标准试图提供适用于所有情况的规则,现在让我们考虑一下:

bool f(int);
bool f(size_t);

for (auto i = 0; f(i); ++i) { }

如果i的类型依赖于for循环中的条件表达式,则编译器可能不会满意。

此外,Herb Sutter在其博客上发布了关于此问题的小帖子:https://herbsutter.com/2015/01/14/reader-qa-auto-and-for-loop-index-variables/