【问题标题】:Why is std::make_tuple(7 + N...) legal in C++11?为什么 std::make_tuple(7 + N...) 在 C++11 中是合法的?
【发布时间】:2014-08-30 03:20:30
【问题描述】:

以下代码在 C++11 中是合法的。

template<int... N>
std::tuple<decltype(N)...> f()
{
    return std::make_tuple(7 + N...); 
}

什么意思?

【问题讨论】:

  • 你怎么知道它是合法的?如果您将它提供给编译器并且它没有抱怨,那几乎没有任何意义。
  • 此代码在 C++11 中是不合法的。由于缺少尾随返回类型,这是 C++14 代码。
  • @n.m.,我只是盲目相信gcc。
  • @Potatoswatter 现在问题中没有可编译的代码,恕我直言,编辑不好......
  • 好了,C++11了。

标签: c++ templates c++11 variadic-templates compile-time-constant


【解决方案1】:

首先看模板参数:template &lt;int ... N&gt;。尽管可以给f 提供可变数量的模板参数,但它们都必须是int 类型。

现在,当您使用 f&lt;t1, t2, ..., tn&gt; 时,parameter unpacking (7 + N...) 将遵循 模式 7 + N 并扩展为

7 + t1, 7 + t2, 7 + t3, ..., 7 + tn

因此,您最终会得到一个元组,其中包含的每个模板参数都增加了 7 个。详细信息可以在第 14.5.3 节可变参数模板 [temp.variadic] 中找到。

3。包扩展由一个模式和一个省略号组成,其实例化会在列表中产生零个或多个模式的实例化 [...]。

【讨论】:

  • Live example。注意-std=c++1y
  • @rubenvb:事先注意到了,但没有过多考虑自动类型推导(最近 Haskell 太多了)。但是现在想来,真的可以在不牺牲小猫的情况下,创建一个具有相同模板参数并输入C++11的函数吗?
  • @rubenvb:我看到了自己。我知道有类似decltype 的东西,但我已经很久没有使用过模板元编程了。两个小时的睡眠已经不够了:D.
猜你喜欢
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 2012-10-17
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2017-04-16
相关资源
最近更新 更多