【发布时间】:2017-09-28 17:16:43
【问题描述】:
标准大师的问题。
试图回复another question,我开始怀疑代码的格式是否正确。
据我所知,以下代码格式不正确
int main ()
{
std::tuple<> a;
std::get<0>(a);
}
因为当t 是std::tuple<Ts...> 时,对std::get<I>(t) 的调用在I 超出[0, sizeof...(Ts)[ 的范围时是不正确的。
在这种情况下,sizeof...(Ts) 为零,因此范围 [0, 0[ 为空,因此对于每个索引 I,std::get<I>(a) 的格式都是错误的。
但是当std::get<I>(a) 被一个空的可变参数包扩展时呢?
我的意思是:下面的代码
#include <tuple>
template <typename ... Args>
void bar (Args const & ...)
{ }
template <std::size_t ... I>
void foo ()
{
std::tuple<> a;
bar( std::get<I>(a) ... );
}
int main ()
{
foo<>();
}
使用格式不正确的 (?) 调用 (std::get<I>(a)) 但零时间可变参数展开(sizeof...(I) 为零),是格式正确还是格式错误?
【问题讨论】:
标签: c++ c++11 templates variadic-templates well-formed