为什么自动说明符的类型推导只关心 for 循环的初始字段?
Why type deduction for auto specifier cares about only init field of the for-loop?
下面的例子看起来很简单明了:
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。问题是——如果 auto 不能依赖条件字段,那么在这种 for 循环中有什么意义呢?如果编译分析整个语句并给出预期结果而不是我们现在得到的结果,会不会太费力和耗时?
因为变量的类型是在声明时确定的(从它的初始值设定项),它与如何使用它无关。如有必要,将考虑类型转换。该规则与显式声明类型的变量相同,auto
只是帮助您推断类型,它并不特殊。
试着考虑一下:
auto max = 5u;
for (auto i = 0; i < max; ++i)
// ~~~~~~~~
// i should be unsigned int, or max should be int ?
顺便说一句:如果您希望类型由条件字段确定,则可以使用 decltype
max
:
for (decltype(max) i = 0; i < max; ++i)
关键字 auto
与 for
语句的其余部分无关,它也不知道。如果你说它应该从 max
推断,你是在说 延迟类型推导 ,这不符合 auto
类型推断规则。
另外,这个呢?
size_t max = 5;
short min = 1;
for (auto i = 0; i < max && i > min; ++i)
它应该推断为 short
还是 size_t
?你不能让编译器读懂你的想法!
此外,这种延迟推理规则(如果有的话)会使模板元编程复杂化。
您实际上提供了一个非常简单的案例,其中条件是一个简单的 i < max
,其中 max
的类型已知。该标准试图提供适用于所有情况的规则,现在让我们考虑一下:
bool f(int);
bool f(size_t);
for (auto i = 0; f(i); ++i) { }
如果 i
的类型依赖于 for
循环中的条件表达式,您的编译器可能不会满意。
另外,Herb Sutter as a small post 在它的博客上实际上是关于这个问题的:https://herbsutter.com/2015/01/14/reader-qa-auto-and-for-loop-index-variables/
下面的例子看起来很简单明了:
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。问题是——如果 auto 不能依赖条件字段,那么在这种 for 循环中有什么意义呢?如果编译分析整个语句并给出预期结果而不是我们现在得到的结果,会不会太费力和耗时?
因为变量的类型是在声明时确定的(从它的初始值设定项),它与如何使用它无关。如有必要,将考虑类型转换。该规则与显式声明类型的变量相同,auto
只是帮助您推断类型,它并不特殊。
试着考虑一下:
auto max = 5u;
for (auto i = 0; i < max; ++i)
// ~~~~~~~~
// i should be unsigned int, or max should be int ?
顺便说一句:如果您希望类型由条件字段确定,则可以使用 decltype
max
:
for (decltype(max) i = 0; i < max; ++i)
关键字 auto
与 for
语句的其余部分无关,它也不知道。如果你说它应该从 max
推断,你是在说 延迟类型推导 ,这不符合 auto
类型推断规则。
另外,这个呢?
size_t max = 5;
short min = 1;
for (auto i = 0; i < max && i > min; ++i)
它应该推断为 short
还是 size_t
?你不能让编译器读懂你的想法!
此外,这种延迟推理规则(如果有的话)会使模板元编程复杂化。
您实际上提供了一个非常简单的案例,其中条件是一个简单的 i < max
,其中 max
的类型已知。该标准试图提供适用于所有情况的规则,现在让我们考虑一下:
bool f(int);
bool f(size_t);
for (auto i = 0; f(i); ++i) { }
如果 i
的类型依赖于 for
循环中的条件表达式,您的编译器可能不会满意。
另外,Herb Sutter as a small post 在它的博客上实际上是关于这个问题的:https://herbsutter.com/2015/01/14/reader-qa-auto-and-for-loop-index-variables/