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

Tom*_*unt 3 c++ auto c++11

在可用的C++中,最好使用auto许多变量,特别是那些类型已知但输入很烦人的变量:

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

当有意义时,例如对于锁定,对RAII对象使用微范围也是很好的:

some_setup_code();
int val;
{
    lock_guard<mutex> lk(mut);
    val = read_shared_memory();
}
do_something(val);
Run Code Online (Sandbox Code Playgroud)

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

明显的版本不起作用:

auto val;
{
    lock_guard<mutex> lk(mut);
    val = read_shared_memory();
}
do_something(val);
Run Code Online (Sandbox Code Playgroud)

由于auto没有初始化程序的变量,这在编译时失败.

同样,您不能在范围块内声明变量,否则以后就无法使用它.

我能看到的唯一直接选项是1.明确地输出变量声明(bleah),或者2.使用auto其他一些你知道属于同一类型的表达式(不是改进).还有其他方法吗?

Nic*_*las 15

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

auto val = [&]() {
    lock_guard<mutex> lk(mut);
    return read_shared_memory();
}();
Run Code Online (Sandbox Code Playgroud)

  • @KyleStrand:你可能仍然使用常规功能.哪个更老的学校,但更好的可重用性. (3认同)

Ale*_*exD 8

你可以考虑一下

decltype(read_shared_memory()) val;
{
    lock_guard<mutex> lk(mut);
    val = read_shared_memory();
}
do_something(val);
Run Code Online (Sandbox Code Playgroud)

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