2016-07-25 19 views
10

Betrachten Sie das folgende Beispiel minimal:Falten Ausdrücke und leere Parameter Pack: Was ist das erwartete Ergebnis?

#include<cstddef> 

template<std::size_t... I> 
constexpr auto sum() { return (I + ...); } 

template<bool... B> 
constexpr auto check() { return (B && ...); } 

int main() { 
    static_assert(6 == sum<1,2,3>(), "!"); 
    // static_assert(0 == sum<>(), "!"); 
    static_assert(check<true, true>(), "!"); 
    static_assert(check<>(), "!"); 
} 

Die Kommentarzeile nicht kompiliert.
Das gleiche gilt für * anstelle von +.
Der Boolean funktioniert stattdessen.

Here (Arbeitsentwurf) Ich habe keine Erwähnungen über leere Parameterpakete gefunden.
Auf der anderen Seite, here (ISOCCP) scheint es, dass das Standardergebnis in dem obigen Fall int() ist.

Was ist genau das erwartete Verhalten beim Mischen von Faltexpressionen und einem leeren Parameterpaket?

Antwort

12

Dies wird in [temp.variadic]¶9 (Zitat N4618) behandelt:

Wenn N Null für einen unäre fold-Ausdruck ist, wird der Wert des Ausdrucks in Tabelle 14 gezeigt; Wenn der Operator nicht in Tabelle 14 aufgeführt ist, ist die Instanziierung fehlerhaft.

Tabelle 14 - Wert der leere Sequenzen Faltung:

Operator | Value when parameter pack is empty 
----------------------------------------------- 
&&  | true 
||  | false 
,   | void() 

Der Grund nur diese drei Betreiber unterstützt werden, ist in P0036R0 skizziert.

+0

Ich wäre neugierig zu wissen, warum diese Betreiber ausgesondert wurden, anstatt sie alle schlecht geformt zu machen. – Borgleader

+4

@Borgleader: Siehe [P0036R0] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0036r0.pdf). Allerdings sagt [P0160R0] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0160r0.html), dass Standardwerte für leere Parameterpakete so aufgelöst wurden, dass sie vollständig entfernt wurden. Ich bin mir nicht sicher, was sich geändert hat oder warum dies im aktuellen Entwurf nicht berücksichtigt wird. – ildjarn

+0

@ildjarn Das hat im Plenum keinen Konsens gefunden, also haben sie letztendlich P0036 gewählt. –