我正在玩dynRust 1.27中引入的特性,并且偶然发现了这个编译错误:
error[E0433]: failed to resolve. Use of undeclared type or module `dyn`
--> src\main.rs:1:30
|
1 | fn _run0() -> Result<(), Box<dyn ::std::error::Error>> { Ok(()) }
| ^^^ Use of undeclared type or module `dyn`
Run Code Online (Sandbox Code Playgroud)
所有其他变种编译正常:
fn _run0() -> Result<(), Box<dyn ::std::error::Error>> { Ok(()) } // Error
fn _run1() -> Result<(), Box<dyn std::error::Error>> { Ok(()) } // Ok
fn _run2() -> Result<(), Box<::std::error::Error>> { Ok(()) } // Ok
Run Code Online (Sandbox Code Playgroud)
这是打算行为吗?
rustc 1.27.0(3eda71b00 2018-06-19)
在我们的产品中,我们的代码可以简化为本质上这个函数:
#include <boost/asio/steady_timer.hpp>
#include <functional>
void DelayedCall(
boost::asio::io_service& io,
boost::asio::steady_timer::duration delay,
std::function<void()> f)
{
auto timer = std::make_shared<boost::asio::steady_timer>(io, delay);
timer->async_wait(
[timer, f](boost::system::error_code const&)
{
// Probably it's ok to do even this:
//timer.reset();
f();
}
);
}
Run Code Online (Sandbox Code Playgroud)
为简单起见,假设该io对象具有全局生命周期。
正如您所看到的,计时器对象将在处理程序的析构函数中被销毁。
当我想到这个问题时,我注意到计时器中对执行处理程序的一些引用,反之亦然。我知道计时器析构函数将在所有异步等待处理程序上调用取消,但这无关紧要,因为处理程序已经在执行并且无法取消。
现在我认为计时器对象只是时间到来时post()的处理程序io_service,因此计时器和处理程序都变得彼此独立。然而,快速尝试调查 asio 源代码失败了,所以我仍然不确定我们的代码是否正确。
我偶然发现了这个问题:线程访问另一个线程的堆栈。链接的问题是关于纯C的,但是我的主要语言是C ++,因此我尝试查找相同的规则是否适用于C ++。
我在C11草案中找到了本节N1570:
6.2.4.5其标识符声明为无链接且没有存储类说明符为static的对象与某些复合文字一样具有自动存储持续时间。尝试从与对象关联的线程之外的线程间接访问具有自动存储期限的对象的结果是 实现定义的。
我相信C ++ 20草案的相应部分N4810是[basic.stc.auto],并且没有提到这种情况。C ++ 11草案的这一部分与C ++ 20的文本完全相同。
在下面,[intro.multithread]我发现这句话带脚注:
程序中的每个线程都可以潜在地访问程序中的每个对象和函数。
具有自动或线程存储持续时间(6.6.5)的对象与一个特定线程相关联,并且只能由指针或引用(6.7.2)间接由另一个线程访问。
因此,我假设在C ++中从另一个线程访问具有自动存储持续时间的对象总是好的(直到对象生命周期的结束,并且当然也没有数据争用)。那是对的吗?
在构造闭包对象期间,我找不到有关引发异常的任何信息。
显而易见,此表达式在向量的副本构造期间可能会抛出:
auto v = std::vector<int>(1000000);
[v]{};
Run Code Online (Sandbox Code Playgroud)
但是像这样的空列表或“按引用”捕获列表呢?
[&]{};
Run Code Online (Sandbox Code Playgroud)
我现在只讲封闭对象的构造。打电话没意思。
我阅读了5.1.2 Lambda expressions [expr.prim.lambda],但是没有发现关于无担保的特殊要求。
是否有一种标准的方法来总结Nums的元组?
(1, 2) + (3, 4)
Run Code Online (Sandbox Code Playgroud)
我认为有很多方法可以实现这一目标.举几个例子:编写自己的函数/运算符,创建(Num a, Num b) => (a, b)一个实例Num,将元组包装在一个newtype等等中.
似乎这个问题应该定期出现,但我没有在谷歌或搜索结果中看到任何标准解决方案.我错过了什么吗?