0

为什么没有以下代码无效constexpr

template<typename ...Tpack>
auto CalculateSum(Tpack ...pack)
{
    if constexpr (sizeof...(Tpack) > 0)
    return (pack + ...);
    else
        return 0;
}

int main()
{
    std::cout << CalculateSum(2, 3, 4, 5, 7.5, 6) << '\n';
}

而如果仅int在论点中存在,则它是有效的。

编译器说:返回类型中的“auto”在此处推导为“int”,但在前面的 return 语句中推导为“double”

但如何constexpr解决?

4

1 回答 1

3

您需要 theif constexpr而不是 plain的原因if是您试图返回两种不同的类型,这是自动返回类型扣除所不允许的。

使用return (pack + ...);返回类型将是double因为您的参数之一是 a double。另一方面,return 0;将返回一个int. 由于这些类型不匹配,您会收到错误消息。您需要if constexpr制作return (pack + ...);return 0;成为唯一实际编译的代码行,这使您只剩下函数可以返回的单一类型。

如果您切换到使用尾随返回类型,则可以摆脱if constexpr并使用普通的if类似

template<typename ...Tpack>
auto CalculateSum(Tpack ...pack) -> decltype((pack + ...))
{
    if (sizeof...(Tpack) > 0)
        return (pack + ...);
    else
        return {};
}

但这不是DRY,而且打字更多,所以我更喜欢这个if constexpr版本。

于 2021-08-26T15:08:15.483 回答