C++;11外部作用域变量声明为自动 在C++中,它是可用的,对于许多变量,尤其是那些类型已知但恼人的类型:,使用 Auto 是一个很好的实践。 weird_template_type<int,char>::subtype::recursive_subtype some_function() { // ... } // ... auto val = some_function(); 怪异的模板类型::子类型::递归的子类型一些函数(){ // ... } // ... auto val=某个函数();

C++;11外部作用域变量声明为自动 在C++中,它是可用的,对于许多变量,尤其是那些类型已知但恼人的类型:,使用 Auto 是一个很好的实践。 weird_template_type<int,char>::subtype::recursive_subtype some_function() { // ... } // ... auto val = some_function(); 怪异的模板类型::子类型::递归的子类型一些函数(){ // ... } // ... auto val=某个函数();,c++,c++11,auto,C++,C++11,Auto,在有意义的情况下,也可以对RAII对象使用显微镜,例如用于锁定: some_setup_code(); int val; { lock_guard<mutex> lk(mut); val = read_shared_memory(); } do_something(val); some_setup_code(); int-val; { 锁紧装置lk(mut); val=读取共享内存(); } 做点什么(瓦尔); 有没有办法混合这两种习惯用法,例如,当共享内存读取代

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

some_setup_code();
int val;
{
    lock_guard<mutex> lk(mut);
    val = read_shared_memory();
}
do_something(val);
some_setup_code();
int-val;
{
锁紧装置lk(mut);
val=读取共享内存();
}
做点什么(瓦尔);
有没有办法混合这两种习惯用法,例如,当共享内存读取代码返回奇怪类型时

明显的版本不起作用:

auto val;
{
    lock_guard<mutex> lk(mut);
    val = read_shared_memory();
}
do_something(val);
autoval;
{
锁紧装置lk(mut);
val=读取共享内存();
}
做点什么(瓦尔);
由于没有初始值设定项的
auto
变量,此操作在编译时失败

类似地,不能在作用域块内声明变量,否则以后就不可用

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

你可以考虑

decltype(read_shared_memory()) val;
{
    lock_guard<mutex> lk(mut);
    val = read_shared_memory();
}
do_something(val);
decltype(read_shared_memory())val;
{
锁紧装置lk(mut);
val=读取共享内存();
}
做点什么(瓦尔);

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

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

auto val = [&]() {
    lock_guard<mutex> lk(mut);
    return read_shared_memory();
}();
auto val=[&](){
锁紧装置lk(mut);
返回读取共享内存();
}();

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

int read_shared_int_memory(std::mutex &mut);
{
    std::lock_guard<std::mutex> lock(mut);
    return read_shared_memory();
}

可能是
decltype()
auto val=(锁定保护(mut),读取共享内存();做点什么(瓦尔)我想指出,在大多数情况下,在一个“真实”范围的中间打开一个新的范围,用于锁定目的意味着一个设计问题。你应该考虑为什么这就是你doing@ZivS为什么会这样?这只是1的自然结论。保持关键部分小,并2。使用RAII。首选的设计是什么?这取决于用例。但是在你的代码中,为什么read_内存中的锁不共享内存呢?这是我过去考虑过的事情,但我认为这对未来的维护人员来说可能太混乱了。你怎么知道这是一个“典型”的解决方案呢?JS开发者会称之为IIFE;从这个角度来看,我很熟悉。不确定有多少重叠,但在我这方面没有混淆。@KyleStrand:您可能仍然使用常规函数。它更老派,但更易于重用。@Jarod42是的,这是我通常倾向的方向。我很喜欢lambda方法避免了大量的
safe\u do\u some\u thing()
函数调用非线程安全的
do\u some\u thing()
函数。但是,存在更好的解决方案…不要使用。:)除了违反DRY之外,此解决方案要求您正在初始化的类型可以默认构造。@GManNickG哦,我同意,它不是最干净的类型。但是假设我们要设置多个变量,那么lambda看起来也不好看。(顺便说一句,就我个人而言,我喜欢@cpplearner的评论。)
auto val = read_shared_int_memory(mut);