自动关键字

时间:2015-09-17 17:00:54

标签: c++

我使用auto关键字有点新鲜。我工作的项目最近才转向使用所有支持它的编译器。我想做一个代码更改,我只能在其中一个需要正确的编译器中轻松测试(我正在测试一个ICC版本。它需要在ICC,GCC和MSVC)。所以我想确保我对auto的这种使用的理解是正确的。

原始代码是: f_y( f_x() ); 其中f_x()将const&返回给某个东西,而f_y将const&返回到同一个东西。当且仅当真正需要复制和修改时,我需要更改代码以复制/修改它。当不需要复制时,复制可能太大。所以我写道:

auto const& c=f_x();
if ( c.size()==1 && c[0].second<0.0 )
{
   auto c_copy = c;
   c_copy[0].second = 1.0;
   f_y( c_copy );
}
else
   f_y( c );

我很好奇我第一次使用const时是否真的需要auto,或者编译器是否推断它是因为f_x()返回const&。但即使不需要,只要没有编译器对它感到困惑,我就希望它能让我的代码可以理解。

主要是我问第二个汽车。我测试的一个编译器使得调用引用的对象类型的复制构造函数(而不是仅复制引用)。我很确定这是该代码的唯一可能含义。但我更有信心所有理解汽车的ICC,GCC和MSVC的版本都会这样理解。

BTW,编译器知道c[0].first的数据类型,但在源代码中,程序员不知道(也不相关)。

1 个答案:

答案 0 :(得分:1)

auto删除了引用和顶级cv限定符(constvolatile)。

c的类型为something const&,即使您撰写auto& c = f_x()(与Scott Meyers的第15张幻灯片中v5的情况相同),它也会相同const {3}})所以你不需要c_copy

something的类型是const(注意:没有v3,即使RHS是const引用;与同一张幻灯片上的c_copy = c相同),这就是为什么function theme_form_alter(&$form, &$form_state, $form_id) { if($form_id == 'search_block_form') { $form['actions']['submit']['#value'] = decode_entities('&#xf002;'); } } 调用复制构造函数。