2013-05-28 2 views
7

Betrachten Sie dieses Beispiel:erfasste Variable Felle übergeben Variable in Lambda. wie man sich versteckt?

int main() 
{ 
    int a = 100; 
    std::cout<<[=,&a](int a,int b){return a+b;}(99,1); 
    return 0; 
} 

Der Ausgang ist 101 statt meiner Erwartung 100.

Ich kann nicht als [&a,=] so angeben, wie es Fehler gibt.

Wie vermeide ich den Namen versteckt und verweisen auf den Parameter. Ich weiß, den Namen ändern ist die Option, aber ich bin neugierig. Referenz auch wird hilfreich sein Standard

EDIT: Ich verwende gcc 4.7.1

EDIT:

hier ist die ideone Link, um die Demo zeigt. i verwendet C++ 4.7.2 complier es
ideone

+3

kann nicht nur Sie ** ** eines der Argumente und der äußeren lokale Variable umbenennen? –

+1

ja ich habe das in meiner Frage erwähnt, aber ich bin neugierig, warum das getan werden kann? –

+2

'[&, =]' übergeben Sie alle Variablen als Referenz ** und ** alle gleichzeitig durch Kopieren?! Es ist bedeutungslos für mich. – deepmax

Antwort

7

Ich konnte nichts im Zusammenhang mit Lambdas in der Norm finden, die anzeigen würde, dass Ihre Ergebnisse das erwartete Verhalten sind. Ich stimme Andys Kommentar zu, dass dies ein Fehler in GCC ist. GCC 4.7.2 unter Linux, GCC 4.7.2 von MinGW und GCC 4.8.0 von MinGW liefern die gleichen Ergebnisse wie in der Frage, aber VC++ 10 und VC++ 11 ergeben die erwarteten Ergebnisse.

sollten Sie filing a bug report betrachten

+0

Vielen Dank :) –

1

Wie kann ich die hier äußere a ausdrucken, aber im inneren Umfang?

int a = 1; 
{ 
    int a = 2; 
    cout << a << endl; 
} 

Sie können entweder den Namen einer der Variablen ändern - oder nicht.

Das gleiche gilt für Ihr Lambda.

(Ich entschuldige mich, dass ich nicht die Standard-Referenz kann wie Sie angefordert - ich es nicht haben.)

+0

nein eigentlich wird das äußere a nicht das innere bedruckt. Siehe die Frage. Wenn Sie eine Klarstellung benötigen, lassen Sie es mich wissen –

+2

Oh - das ist wirklich komisch. Das erfasste "a" überschreibt also den Parameter "a". Das könnte ein Compiler Bug sein? –

3

Da der Parameter, die Sie benennen können keinen Rahmen haben, können Sie nicht verwenden können, Scope Resolution Operator zu disambiguate, noch this oder andere solche Mittel. Daher ist es unmöglich, dieses Szenario so zu definieren, wie Sie es möchten. Sie müssen Ihren Variablen nicht nur schreckliche und widersprüchliche Namen geben.

+0

ich stimme zu, aber das ist etwas, dass ich unwissentlich stieß, als ich meinen Code debugging. aber selbst dann glaube ich, dass der Parameter die erfasste Variable verbergen würde. Ich habe mich bereits in meinem Code geändert, bin aber wirklich neugierig geworden. –

Verwandte Themen