关于自动类型推导,哪一项是正确的?
Which one is correct about the auto type deduction?
我对 模板 类型推导有点困惑。但是当涉及到 auto 时,它变得更加混乱。我希望我尝试提供的示例可以总结我的困惑。
std::unordered_map<std::string, int> _m;
//.......
for(auto _pair : _m)
{
// do stuff
{
现在通常地图的每个元素都是
std::pair<const std::string, int>
我的问题是,我在 for 循环中编写的代码是否会影响 auto 推导的类型?编译器是否尝试找到一种方法来将循环内的代码与自动推导的内容相匹配?
auto
纯粹是在代码初始化值的上下文中确定的,而不是后续使用。尝试根据任意数量的后续代码推断出几种可能的替代类型中的一种,将导致类型推导器中的有效无限复杂性。
这就是为什么像 GMP "expression types" 这样的巧妙技巧(用于避免在赋值之前计算一个值,因为随后的数学运算可能会导致更有效的解决方案)不能与类型推导一起正常工作;将 auto
与它们一起使用会尝试存储中间表达式,而不是已实现的 mpz_class
等,即使后续代码需要已实现的类型。
我对 模板 类型推导有点困惑。但是当涉及到 auto 时,它变得更加混乱。我希望我尝试提供的示例可以总结我的困惑。
std::unordered_map<std::string, int> _m;
//.......
for(auto _pair : _m)
{
// do stuff
{
现在通常地图的每个元素都是
std::pair<const std::string, int>
我的问题是,我在 for 循环中编写的代码是否会影响 auto 推导的类型?编译器是否尝试找到一种方法来将循环内的代码与自动推导的内容相匹配?
auto
纯粹是在代码初始化值的上下文中确定的,而不是后续使用。尝试根据任意数量的后续代码推断出几种可能的替代类型中的一种,将导致类型推导器中的有效无限复杂性。
这就是为什么像 GMP "expression types" 这样的巧妙技巧(用于避免在赋值之前计算一个值,因为随后的数学运算可能会导致更有效的解决方案)不能与类型推导一起正常工作;将 auto
与它们一起使用会尝试存储中间表达式,而不是已实现的 mpz_class
等,即使后续代码需要已实现的类型。