C ++ 11外部范围变量声明为auto

汤姆·亨特

在可用的C ++中,最好使用auto许多变量,尤其是那些类型已知但讨厌键入的变量:

weird_template_type<int,char>::subtype::recursive_subtype some_function() {
    // ...
}
// ...
auto val = some_function();

在有意义的情况下,将显微镜用于RAII对象也是很好的,例如用于锁定:

some_setup_code();
int val;
{
    lock_guard<mutex> lk(mut);
    val = read_shared_memory();
}
do_something(val);

有没有办法混合这两个习惯用法,例如,当您的共享内存读取代码返回一个奇怪的类型时?

明显的版本不起作用:

auto val;
{
    lock_guard<mutex> lk(mut);
    val = read_shared_memory();
}
do_something(val);

由于auto没有初始化程序变量,因此在编译时失败

同样,您不能在作用域块内声明变量,否则以后将不可用。

我唯一能看到的直接选择是1.明确地键入变量声明(bleah),或2.auto与其他已知类型相同的表达式一起使用(不是改进)。还有其他方法吗?

尼科尔·波拉斯(Nicol Bolas)

基本上,您所说的是复杂的变量初始化。典型的解决方案是使用lambda:

auto val = [&]() {
    lock_guard<mutex> lk(mut);
    return read_shared_memory();
}();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章