C++11 外部作用域变量声明为 auto

C++11 outer scope variable declared 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);

有没有办法混合这两个成语,例如当你的共享内存读取代码 returns 是一个奇怪的类型时?

明显的版本不起作用:

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

由于 auto 变量没有初始化器,这在编译时失败。

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

我能看到的唯一直接选项是 1. 显式键入变量声明 (bleah),或 2. 将 auto 与您知道属于同一类型的其他表达式一起使用(不是改进).还有其他方法吗?

你可以考虑

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

尽管它不一定不那么冗长。

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

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

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

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);