12

次の最小限の例を考えてみましょう。

#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<>(), "!");
}

コメント行はコンパイルされません。の代わりに を
使用しても同じことが当てはまります。 ブール値を含むものは代わりに機能します。*+

ここ(ワーキング ドラフト) では、空のパラメーター パックに関する言及は見つかりませんでした。
一方、ここ(isocpp) では、上記の場合のデフォルトの結果は のようですint()

フォールド式と空のパラメーター パックを混在させると、正確にはどのような動作が期待されますか?

4

1 に答える 1

15

これは[temp.variadic]¶9でカバーされています(N4618 を引用):

Nが単項 fold-expression でゼロの場合、式の値は表 14 に示されています。演算子が表 14 にリストされていない場合、インスタンス化は不適切な形式です。

表 14 — 空列の折り畳みの値:

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

これら 3 つの演算子のみがサポートされている理由は、P0036R0で概説されています。

于 2016-07-25T16:44:23.723 に答える