And*_*mov 3 c++ auto c++11 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);
}
Run Code Online (Sandbox Code Playgroud)
但它不会编译(至少使用VS2013)因为i被推断为int而不是size_t.问题是 - 如果不能依赖条件字段,那么for循环中auto的意义何在?如果编译分析整个语句并给出预期结果而不是我们现在拥有的结果,那会是太难和耗时吗?
son*_*yao 12
因为变量的类型是在声明时(从其初始化器)确定的,所以它与如何使用它没有任何关系.如果需要,将考虑类型转换.该规则与使用显式指定的类型声明的变量相同,auto只是帮助您推断出类型,它并不特殊.
试着考虑一下:
auto max = 5u;
for (auto i = 0; i < max; ++i)
// ~~~~~~~~
// i should be unsigned int, or max should be int ?
Run Code Online (Sandbox Code Playgroud)
顺便说一句:decltype如果您希望条件字段确定类型,则可以使用max:
for (decltype(max) i = 0; i < max; ++i)
Run Code Online (Sandbox Code Playgroud)
关键字auto与for声明的其余部分没有任何关系,也不知道它.如果你说它应该推断出来max,你就是说延迟类型推导,这将不符合auto类型推理规则.
另外,这个怎么样?
size_t max = 5;
short min = 1;
for (auto i = 0; i < max && i > min; ++i)
Run Code Online (Sandbox Code Playgroud)
它应该推断short还是size_t?你不能让编译器读懂你的想法!
此外,这种延迟推理规则(如果有的话)会使模板元编程变得复杂.
实际上,您提供了一个非常简单的情况,其中条件很简单,其中已知i < max类型max.该标准试图提供适用于所有情况的规则,现在让我们考虑一下:
bool f(int);
bool f(size_t);
for (auto i = 0; f(i); ++i) { }
Run Code Online (Sandbox Code Playgroud)
如果类型i依赖于for循环中的条件表达式,则编译器可能不会满意.
此外,Herb Sutter在其博客上发布了关于此问题的小帖子:https://herbsutter.com/2015/01/14/reader-qa-auto-and-for-loop-index-variables/
| 归档时间: |
|
| 查看次数: |
218 次 |
| 最近记录: |