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

C++11 outer scope variable declared auto

本文关键字:auto 声明 变量 外部 作用域 C++11      更新时间:2023-10-16
在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与您知道属于相同类型的其他表达式一起使用(不是改进(。还有其他方法吗?

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

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

你可以考虑

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

虽然它不一定不那么冗长。

您可以为此创建一个帮助程序函数:

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