3

ラムダ関数のコンパイル中に問題に直面しました:

... (int level = 3) ...
QString str = [level] {QString s;for(int i=0;i++<level;s.append(" "));return s;};

エラーの内容:

error: conversion from 'GainStatistic::getWidgetAndProps(QObject*, int)::<lambda()>' to non-scalar type 'QString' requested

私はこの変種を試しました:

... (int level = 3) ...
QString str ([level] {QString s;for(int i=0;i++<level;s.append(" "));return s;});

error: no matching function for call to 'QString::QString(GainStatistic::getWidgetAndProps(QObject*, int)::<lambda()>)'

しかし、関数内のラムダ式は単に何らかの型の値ですか? そうですか?したがって、コンストラクターをQString(lambda-that-returns-QString)呼び出す必要があり、これが機能する必要があります。QString::QString(const QString& ref)

... (int level = 3) ...
QString str([level] {const QString& ref = "123";return ref;}); //leads to the same error

別のバリアント:

QString str = [level]->QString {QString s;for(int i=0;i++<level;s.append(" "));return s;};

error: expected token ';' got 'str'

MinGW 4.6.1

4

3 に答える 3

12

にラムダを割り当てようとしていQStringます。何が起こると思いますか?引数を取らないラムダは nullary 関数です。戻り値を取得するには、それを呼び出す必要があります。

例えば

int x = [] { return 23; }();
                         ^^
                        call

また、引数のないラムダの構文を教えてくれてありがとう。これが可能だとは知りませんでした。また、本当に合法かどうかも少しわかりません。

編集:合法です。5.1.2

lambda-expression:
    lambda-introducer lambda-declarator{opt} compound-statement

lambda-declarator:
    (parameter-declaration-clause) mutable{opt}
于 2012-05-07T09:21:32.307 に答える
2

ラムダは、基本構造を持つ無名関数[capture](arguments){code}です。ラムダに引数を渡しません。私はあなたが欲しいと思います

QString str = [](int x){QString s;for(int i=0;i++<x;s.append(" "));return s;} (level);
//            ^^ lambda starts here                         argument to lambda ^^   
于 2012-05-07T09:24:38.077 に答える
0

C++11 標準から、5.1.2.2 (私が短縮)

ラムダ式の型(クロージャー オブジェクトの型でもあります) は、名前のない一意の非共用体クラス型 (クロージャー型と呼ばれます) であり、そのプロパティについては以下で説明します。[その他のテキストが続きます]

したがって、他の人が言ったこととQString、ラムダの型には互換性がありません。

于 2012-05-07T09:28:11.617 に答える