我使用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
的数据类型,但在源代码中,程序员不知道(也不相关)。
答案 0 :(得分:1)
auto
删除了引用和顶级cv限定符(const
和volatile
)。
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('');
}
}
调用复制构造函数。