36 Stimmen

C++11 lambda in decltype

Für den folgenden Code:

auto F(int count) -> decltype([](int m) { return 0; }) 
{                                                               
    return [](int m) { return 0; };                                  
}

g++ 4.5 gibt die Fehler aus:

test1.cpp:1:32: error: expected primary-expression before 'int'
test1.cpp:1:32: error: expected ')' before 'int'

Was ist das Problem? Was ist der richtige Weg, um ein Lambda aus einer Funktion zurückzugeben?

48voto

Puppy Punkte 141483

Sie können einen Lambda-Ausdruck nur verwenden, indem Sie das Objekt tatsächlich erstellen - das macht es unmöglich, ihn an eine Typ-Deduktion wie decltype zu übergeben.

Ironischerweise sorgen die Lambda-Rückgaberegeln natürlich dafür, dass Sie Lambdas von Lambdas zurückgeben KÖNNEN, da es einige Situationen gibt, in denen der Rückgabetyp nicht angegeben werden muss.

Sie haben nur zwei Möglichkeiten: Sie können einen polymorphen Container zurückgeben, z. B. std::function oder F selbst zu einem echten Lambda machen.

auto F = [](int count) { return [](int m) { return 0; }; };

13voto

Zark Bardoo Punkte 416

Mit C++14 können Sie den Rückgabetyp jetzt einfach weglassen:

auto F(int count)
{
    return [](int m) { return 0; };
}

11voto

Andriy Tylychko Punkte 15609

Etwas in dieser Art Ihren Bedürfnissen entspricht?

#include <functional>

std::function<int(int)> F(int count)
{                                                               
    return [](int m) { return 0; };                                  
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X