C ++ noExcept-Deklaration ändert den Vorlagenabzug

8

Ich habe versucht, das Beispiel auf Seite 91 von Effective Modern C ++ zu bestätigen, und ich stieß auf ein seltsames Problem. Dieser Code

%Vor%

Gibt mir einen Fehler wie

  

error: Anforderung für das Element 'front' in 'a', das nicht vom Typ class ist   'Int' void doStuff (C & amp; a, C & amp; b) noexcept (noexcept (doStuff (a.front (),   b.front ()))) {

Es scheint also, als würde die oberste Version von doStuff aufgerufen, obwohl a.front () und b.front () Referenzen auf ints zurückgeben sollten. Wenn ich alle noexcept-Deklarationen aus dem Code entferne, bekomme ich die erwartete Ausgabe.

Dies ist mit gcc 5.4.

Was mache ich falsch?

Danke

    
piyo 18.08.2016, 17:59
quelle

2 Antworten

7

Das Problem ist, wenn der Name an dieser Stelle nachschlägt:

%Vor%

findet nur ein doStuff() : Ihre Funktionsvorlage. Die Spezialisierung wurde noch nicht deklariert, daher wird sie nicht berücksichtigt.

Zuerst sollten Sie Spezialisierungen vermeiden. Sie sind peinlich. Aber dann wäre die wirkliche Lösung, einen extra leeren Typ nur für argumentabhängige Nachschlagezwecke beizubehalten. Dies fügt dem noexcept -Lookup einen abhängigen Namen hinzu, der den Aufruf bis zur Instanziierung verzögert:

%Vor%     
Barry 18.08.2016, 18:15
quelle
2

Template-Spezialisierungen sind keine Überladungen. Ihre Spezialisierung für doStuff<int> ist keine Überladung von doStuff<C> , sondern eine Spezialisierung. Wenn die Überladungsauflösung dies nicht berücksichtigt, wird die Vorlageninstanziierung dies berücksichtigen, wenn das Original durch Überladungsauflösung ausgewählt wird. Ersetzen Sie Ihre Spezialisierung durch eine Überladung (Nichtvorlage, die zwei int& s einnimmt)

%Vor%     
John 18.08.2016 18:21
quelle

Tags und Links