2016-04-13 7 views
1

// In diesem Fall ist das erste Stück Code wird fehlschlagen und // Idecltype verwirrend ist es eine Notwendigkeit

template<typename A, typename B>  // 1 
auto add(A const& a, B const& b) { return a + b; } 

template<typename A, typename B>  // 2 
auto add(A const& a, B const& b) -> decltype(a + b) { return a + b; } 

Antwort

2

Der erste Weg, bevor c funktioniert nicht mit dem zweiten Stück Code wechseln muß ++ 14, Einführung Rückführungstyp Abzug. Dann brauchen Sie die zweite Form.

+0

Die zweite ist auch SFINAE-freundlich –

+0

@PiotrSkotnicki Würde es Ihnen etwas ausmachen, einige Erklärungen zu geben? Warum ist die erste nicht SFINAE-freundlich? – songyuanyao

+0

@songyuanyao der Ausdruck in einem abschließenden Rückgabetyp dient als Ausdruck SFINAE; Wenn es schlecht geformt ist, wird die Überlastung aus der Menge der Kandidaten ausgeschlossen. dies gilt nicht für 'auto' Rückgabetypabzug (der Ausdruck in einer return-Anweisung wird während der Überladungsauflösung nicht überprüft) –