首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++11外部作用域变量声明为auto

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

Stack Overflow用户
提问于 2017-02-04 06:10:44
回答 3查看 692关注 0票数 3

在可用的C++中,对许多变量使用auto是一种很好的做法,特别是那些类型已知但键入起来很麻烦的变量:

代码语言:javascript
运行
复制
weird_template_type<int,char>::subtype::recursive_subtype some_function() {
    // ...
}
// ...
auto val = some_function();

在有意义的时候,也可以对RAII对象使用显微镜,例如用于锁定:

代码语言:javascript
运行
复制
some_setup_code();
int val;
{
    lock_guard<mutex> lk(mut);
    val = read_shared_memory();
}
do_something(val);

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

显而易见的版本是行不通的:

代码语言:javascript
运行
复制
auto val;
{
    lock_guard<mutex> lk(mut);
    val = read_shared_memory();
}
do_something(val);

这在编译时失败,因为auto变量没有初始值设定项。

同样,您不能在限定了作用域的块中声明变量,否则它将在以后不可用。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-04 06:15:37

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

代码语言:javascript
运行
复制
auto val = [&]() {
    lock_guard<mutex> lk(mut);
    return read_shared_memory();
}();
票数 15
EN

Stack Overflow用户

发布于 2017-02-04 06:15:25

你可以考虑

代码语言:javascript
运行
复制
decltype(read_shared_memory()) val;
{
    lock_guard<mutex> lk(mut);
    val = read_shared_memory();
}
do_something(val);

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

票数 8
EN

Stack Overflow用户

发布于 2017-02-04 06:27:51

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

代码语言:javascript
运行
复制
int read_shared_int_memory(std::mutex &mut);
{
    std::lock_guard<std::mutex> lock(mut);
    return read_shared_memory();
}

然后,简单地说:

代码语言:javascript
运行
复制
auto val = read_shared_int_memory(mut);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42033806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档