Seite 1 von 1

[C++] Fehler: mehrdeutiger Aufruf const/nonconst aus Lambda

Verfasst: 31.07.2018, 11:00
von Schrompf
Hallo Leute,

ich habe gerade ein seltsames Problem, in dem ich eine template-Methode aus einem Lambda heraus aufrufen will und dazu this capture. Und nur VisualStudio 2017 liefert mir "mehrdeutiger Aufruf", GCC und CLANG kompilieren das sauber. Scheint also ein Compilerbug zu sein, aber wessen Fehler?

Code: Alles auswählen

#include <tuple>

class A {
public:
    std::tuple<int, float, double> t;

    template <typename T> T& Get() { return std::get<T>( t); }
    template <typename T> const T& Get() const { return std::get<T>( t); }

    void foo() {
        [this]() { Get<int>(); }();
    }
};
Hier live zum Ausprobieren: https://godbolt.org/g/BXQqA1 Compiliert sauber auf GCC und CLANG, liefert auf Visual Studio aber folgende Fehlermeldung

Code: Alles auswählen

<source>(11): error C2668: 'A::Get': ambiguous call to overloaded function
<source>(8): note: could be 'const T &A::Get<int>(void) const'
        with [ T=int ]
<source>(7): note: or       'T &A::Get<int>(void)'
        with [ T=int ]
<source>(11): note: while trying to match the argument list '()'
Hat jemand eine Idee, was hier passiert? Bzw. welcher der Compiler recht hat? Der Workaround ist ganz einfach, this in ne Variable zu capturen.

Re: [C++] Fehler: mehrdeutiger Aufruf const/nonconst aus Lam

Verfasst: 31.07.2018, 15:34
von dot
Soweit ich das sehen kann, ist das ziemlich sicher ein Compilerbug. Hab mal ein bisschen damit rumgespielt. So wie mir das aussieht, wird this korrekt gecaptured (const falls foo() const ist). Nur bei der Overload Resolution geht dann irgendwas schief. Interessanterweise klappt es, wenn man

Code: Alles auswählen

[this]() { this->f<int>(); }();
macht. Wieder so ein Fall von "ich will gar nicht wissen, wie die Implementierung aussehen muss, damit es zu dem Verhalten hier kommt"…

Schreibst du einen Bugreport?

Re: [C++] Fehler: mehrdeutiger Aufruf const/nonconst aus Lam

Verfasst: 01.08.2018, 20:17
von Schrompf
Hm, müsste ich eigentlich. Ist ja schlimm genug, dass ich sonst immer nur davon profitiere, wenn ihr mal wieder irgendwas in VS gefunden und isoliert habt. Dazu muss ich mir dort erstmal einen Account anlegen. Uärg.

[edit] Da: https://developercommunity.visualstudio ... -with.html

[edit2] Ich sehe gerade, dass das irgendwie in der Rubrik "Visual Studio / Editor" oder so gelandet ist. Ich kann es aber auch nicht mehr editieren. Hoffentlich kümmern die sich trotzdem darum.

Re: [C++] Fehler: mehrdeutiger Aufruf const/nonconst aus Lambda

Verfasst: 18.09.2019, 10:18
von Schrompf
Der Bug ist übrigens neulich gefixt worden. Visual Studio 2019, V16.2.xyz