std::enable_if welcher compiler hat recht?

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Matthias Gubisch
Establishment
Beiträge: 480
Registriert: 01.03.2009, 19:09

std::enable_if welcher compiler hat recht?

Beitrag von Matthias Gubisch »

Hallo Leute

ich habe hier ein kleines C++ Problem:

Code: Alles auswählen

template<bool deferred = true>
class foo
{
    template<typename = std::enable_if_t<deferred>>
    void bar() const
    {

    }
};

int main(void)
{
    foo<false> f1;
    foo<true>  f2;

    return 0;
}
https://godbolt.org/z/8q9qd6q8q

msvc compiliert das ohne probleme, clang und gcc werfen eine error

Frage 1: Wer hat recht? ich vermute leider gcc und clang
Frage 2: jemand eine idee wie ich das zum compilieren bekomme?
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
dot
Establishment
Beiträge: 1738
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: std::enable_if welcher compiler hat recht?

Beitrag von dot »

Matthias Gubisch hat geschrieben: 14.11.2023, 22:40 Frage 1: Wer hat recht? ich vermute leider gcc und clang
Keiner hat unrecht, denn es handelt sich hier offenbar um einen Bug im Standard: https://www.open-std.org/jtc1/sc22/wg21 ... .html#2746. Ich glaube es ist unterspezifiziert ob die implizite Instanziierung eines Klassentemplates auch die implizite Instanziierung der Defaultargumente von Membertemplates mit sich zieht. Ich würde aber mal vermuten, dass das ultimativ ein Bug in clang/gcc werden wird. Defaultargumente werden meinem Verständnis nach normalerweise nicht mitinstantziiert, auch wenn das aktuelle Wording dies nicht explizit ausdrückt (es gibt explizite Ausnahmen für Defaultargumente von Funktionsparametern, für Defaultargumente von Templateparametern scheint das aber zu fehlen).
Matthias Gubisch hat geschrieben: 14.11.2023, 22:40 Frage 2: jemand eine idee wie ich das zum compilieren bekomme?
Easy, nachdem du offenbar eh C++20 verwendest, vergisst du am besten dass es std::enable_if jemals gegeben hat und verwendest constraints:

Code: Alles auswählen

template<bool deferred = true>
class foo
{
    void bar() const requires deferred 
    {

    }
};
Matthias Gubisch
Establishment
Beiträge: 480
Registriert: 01.03.2009, 19:09

Re: std::enable_if welcher compiler hat recht?

Beitrag von Matthias Gubisch »

Danke für die ausführliche Erklärung und den Tipp mit den constraints, da hätte ich auch selber draufkommen können.
Ist sowieso deutlich eleganter.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Antworten