小编Tom*_*Tom的帖子

移动语义和参数评估顺序

考虑以下因素:

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++ operator-precedence move-semantics c++11

25
推荐指数
2
解决办法
522
查看次数

在 F# 中一次强制执行一个 Async Observable

我有一系列可观察的事物需要映射到 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)

这不能按预期工作,因为我不会在任何地方等待结果。有没有办法在 …

f# system.reactive async-await

2
推荐指数
1
解决办法
232
查看次数