0

cppreference.com のコードを理解しようとしています。該当部分はこちら

template<typename... Ts>
std::ostream& operator<<(std::ostream& os, std::tuple<Ts...> const& theTuple)
{
    std::apply
    (
        [&os](Ts const&... tupleArgs)
        {
            os << '[';
            std::size_t n{ 0 };
            ((os << tupleArgs << (++n != sizeof...(Ts) ? ", " : "")), ...);
            os << ']';
        }, theTuple
    );
    return os;
}

上記を正しく解釈している場合((os << tupleArgs << (++n != sizeof...(Ts) ? ", " : "")), ...)、コンマ演算子に対する折り畳み式です。意味的には([some pattern involving the parameter pack's values] , ...)、コンマで折りたたむことを意味します。

しかし、私が得られないのは、なぜsizeofそこにあるのsizeof...ですか?私にとって省略記号は展開を意味しますが、そこを展開したくありません。Tsタプルに似た集約型のようなものです。コンパイラが折り畳みを評価している間、その集約型のコンパイル時のサイズが必要です。実際、Visual Studio では、省略記号の有無にかかわらず、どちらの方法でも機能します。GCCでも同じだ、とGodboltは教えてくれました。(編集:実際には、コンパイルする省略記号がないと間違っていますが、出力には存在しないはずの末尾のコンマが含まれています)

sizeof...パラメータパックのサイズが必要な場合は、常に使用するルールですか?

4

1 に答える 1