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);
有没有办法混合这两个习语,例如,当您的共享内存读取代码返回奇怪的类型时?
明显的版本不起作用:
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);
相关文章:
- 将函数参数类型声明为 auto
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 在 C++14 中使用 decltype(auto) 声明静态数据成员
- C++:在原型中声明"auto"函数返回类型仍然会导致在扣除错误之前使用"auto&quo
- 声明适用于 auto,但不能显式声明类型?
- auto f = bind(dist<>,gen) 在成员声明C++失败。未被识别为函数
- C++11 外部作用域变量声明为 auto
- 没有声明和初始化的类似闭包的函数(即没有'auto f = make_closure();')
- 如何处理"警告:在参数声明中使用'auto'仅适用于 -fconcepts"
- 使用新的 C++11 语法的 auto 进行函数声明,但使用 auto&并且没有 ->
- 如何使用Auto声明无效指针
- 使用 C++11 auto 关键字声明两个(或多个)变量
- 什么时候应该使用 decltype(x) 而不是 auto 来声明变量的类型
- 为什么"auto"将字符串声明为 const char* 而不是 std::string?
- 添加两个整数,但一个声明为"int",另一个声明为"auto"?
- 使用auto声明变量和使用类型名称之间的区别是什么
- 如何在C++中使用关键字"auto"声明和使用变量?
- 使用auto声明变量,并使用原始文字定义的行为进行初始化
- 无法在VS 14 CTP中使用auto声明lambda:类型为'void'的条件表达式是非法的
- 为什么基类不会在同一"auto"声明中自动推导?