3

--例を更新しました--

ここに少しのコードがあります:

int retInt(int a) { return a; }
void randomFunction() 
{
    int a = 3;
    auto future = async([&]{ return retInt(a); });
    const auto ret = future.get();
}

VS2012 インテリセンスは、「ret」は aconst < error-type >であり、コンパイルを許可しないことを通知し、次の出力メッセージを表示します。

['void' から 'const auto' の型を推測できません]

たとえば、「ret」を から に変更しconst autoconst int実際の型を指定すると、すべて正常にコンパイルされますが、自動バージョンが機能しない理由と、バージョンを作成するために何らかのコード変更が行われる可能性があるかどうか疑問に思っています自動コンパイル。

何か案は?

ノート:

の変更

auto future = async([&]{ return retInt(a); });

auto future = async([&] ()->int{ return retInt(a); });

同じ結果が得られます

4

1 に答える 1

2

内部ラムダ式が余分[]にあるため、埋め込まれたラムダ式が表現されます。内部ラムダは戻ります1が、外部ラムダの戻り値の型は指定されていません。これはデフォルトで void です。

変化する

auto afuture = async([&]{ []{ return 1; }; });

に:

auto afuture = async( []{  return 1; });
const auto ret = afuture.get();

編集:

新しいコードは、VS2012 NOV CTP と gcc 4.7.2 で正常に動作します。

注: 参照によってローカル変数 a をキャプチャしています。これは非同期スレッドに対して安全です。値によってキャプチャすることをお勧めします。

auto future = async([=]{ return retInt(a); });
                    ^^^

コンパイルされたサンプル コード:

http://liveworkspace.org/code/X66xE $2

于 2013-01-30T05:59:40.707 に答える