【问题标题】:affect of constexpr on Parameter packconstexpr 对参数包的影响
【发布时间】:2021-08-26 15:02:59
【问题描述】:

为什么没有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 是如何解决的呢?

【问题讨论】:

  • 编译器错误应该可以解释。
  • 您确定要混合这样的类型(intdouble)吗?
  • @AnmolMishra 关于您建议的编辑,而 constexpr 是 C++11 的一部分,折叠表达式和如果 constexpr 都是 C++17 功能,因此该标签不正确。当前的C++标签表示C++20,对于这个Q来说是可以的。

标签: c++ constexpr parameter-pack


【解决方案1】:

您需要 if constexpr 而不是普通的 if 的原因是您试图返回两种不同的类型,而自动返回类型推导不允许这样做。

使用return (pack + ...);,返回类型将是double,因为您的参数之一是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 版本。

【讨论】:

猜你喜欢
  • 2017-01-31
  • 1970-01-01
  • 2018-03-29
  • 2017-02-24
  • 1970-01-01
  • 2013-03-29
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多