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

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Schrompf
Moderator
Beiträge: 4017
Registriert: 26.02.2009, 00:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

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

Beitrag von Schrompf » 31.07.2018, 11:00

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.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.

Benutzeravatar
dot
Establishment
Beiträge: 1667
Registriert: 06.03.2004, 19:10
Echter Name: Michael Kenzel
Kontaktdaten:

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

Beitrag von dot » 31.07.2018, 15:34

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?

Benutzeravatar
Schrompf
Moderator
Beiträge: 4017
Registriert: 26.02.2009, 00:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

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

Beitrag von Schrompf » 01.08.2018, 20:17

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.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.

Benutzeravatar
Schrompf
Moderator
Beiträge: 4017
Registriert: 26.02.2009, 00:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

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

Beitrag von Schrompf » 18.09.2019, 10:18

Der Bug ist übrigens neulich gefixt worden. Visual Studio 2019, V16.2.xyz
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.

Antworten