2016-07-25 46 views
10

考慮下面的小例子:摺疊表達式和空參數pack:期望的結果是什麼?

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

的註釋行不會編譯。
這同樣適用於使用*而不是+
取而代之的是涉及布爾值的那個。

Here(工作草案)我還沒有發現關於空參數包的提及。
另一方面,here(isocpp)似乎在上述情況下的默認結果是int()

混合摺疊表達式和空參數包時,預期的行爲究竟是什麼?

回答

12

這是覆蓋在[temp.variadic]¶9(援引N4618):

如果N爲一元的摺疊式表達零,表達式 的值在表14中示出;如果運營商未在表14中列出,則該實例化格式不正確。

表14 - 摺疊空序列的值:

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

P0036R0概述僅這三個運營商都支持的原因。

+0

我很想知道爲什麼這些操作員被單挑出來,而不是使他們都形成不良。 – Borgleader

+4

@Borgleader:參見[P0036R0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0036r0.pdf)。然而[P0160R0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0160r0.html)表示,空參數包的默認值已解決爲完全移除;我不確定發生了什麼變化,或者爲什麼這不會反映在當前的草案中。 – ildjarn

+0

@ildjarn在全體會議上沒有達成共識,所以最終他們投了P0036。 –

相關問題