以下代码结果为0100(符合CLang,GNU ++ 14)。我希望0001,因为func将rvalue vector作为参数,然后forward(c)[0]是int的const引用,所以decltype(auto)的类型推导应该导致const int&amp ;.请帮我理解结果。谢谢!
template <typename T>
decltype(auto) func(T&& c)
{
return forward<T>(c)[0];
}
int main(int argc, const char * argv[])
{
cout
<< is_same< int, decltype(func(vector<int>{3}))>::value
<< is_same< int&, decltype(func(vector<int>{3}))>::value
<< is_same< const int, decltype(func(vector<int>{3}))>::value
<< is_same< const int&, decltype(func(vector<int>{3}))>::value
<< endl;
return 0;
}
输出:
0100
答案 0 :(得分:4)
c
是左值参考。
[]
有const
和非const
超载。传递vector<T,A>&&
类型的向量时,选择的重载是非const
。
[]
(使&&
重载返回值或rvalue),但这样可能会破坏现有代码。所以这可能至少在std2
之前就不会发生,这允许在不破坏现有代码的情况下破坏std
中的修订。