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

时间:2017-02-03 22:10:44

标签: c++ 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和其他你知道属于同一类型的表达式(不是改进)。还有其他方法吗?

3 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:8)

您可以考虑

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

虽然不一定不那么冗长。

答案 2 :(得分:3)

您可以为此创建一个辅助函数:

int read_shared_int_memory(std::mutex &mut);
{
    std::lock_guard<std::mutex> lock(mut);
    return read_shared_memory();
}

然后,简单地说:

auto val = read_shared_int_memory(mut);