考虑以下因素:
std::string make_what_string( const std::string &id );
struct basic_foo
{
basic_foo( std::string message, std::string id );
};
struct foo
: public basic_foo
{
foo::foo( std::string id)
: basic_foo( make_what_string( id ), std::move( id ) ) // Is this valid?
{
}
};
Run Code Online (Sandbox Code Playgroud)
因为C++中的参数评估顺序是未指定的,所以我想知道是否该行
basic_foo( make_what_string( id ), std::move( id ) )
Run Code Online (Sandbox Code Playgroud)
在上面的代码是有效的.
我知道这std::move只不过是一个演员,但什么时候执行std :: string move ctor?在评估完所有参数之后,是否应该调用基础构造函数?或者这是在评估参数期间完成的?换一种说法:
编译器是否这样做:
std::string &&tmp2 = std::move(id);
std::string tmp1 = make_what_string(id);
basic_foo(tmp1, tmp2);
Run Code Online (Sandbox Code Playgroud)
这是有效的.或这个:
std::string tmp2 = std::move(id);
std::string tmp1 = make_what_string(id);
basic_foo(tmp1, …Run Code Online (Sandbox Code Playgroud) 我有一系列可观察的事物需要映射到 C# 任务。这些 C# 任务不应该同时运行,而是一个接一个地运行。基本上,我需要实现这个 C# 问题的 F# 等价物:
天真地翻译这个 C# 代码会得到如下内容:
let run (idx:int) (delay:int) =
async {
sprintf "start: %i (%i)" idx delay |> System.Diagnostics.Trace.WriteLine
let! t = System.Threading.Tasks.Task.Delay(delay) |> Async.AwaitTask
sprintf "finish: %i" idx |> System.Diagnostics.Trace.WriteLine
t
}
Observable.generate (new Random()) (fun _ -> true) id (fun s -> s.Next(250, 500))
|> Observable.take 20
|> Observable.mapi(fun idx delay -> idx, delay)
|> Observable.bind(fun (idx, delay) -> Observable.ofAsync (run idx delay))
|> Observable.subscribe ignore
|> ignore
Run Code Online (Sandbox Code Playgroud)
这不能按预期工作,因为我不会在任何地方等待结果。有没有办法在 …