为什么从rvalue int vector的元素中对decltype(auto)进行类型推导是int&?

时间:2017-01-13 22:55:03

标签: c++ return-type-deduction

以下代码结果为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

1 个答案:

答案 0 :(得分:4)

c是左值参考。

[]const和非const超载。传递vector<T,A>&&类型的向量时,选择的重载是非const

可以更改

[](使&&重载返回值或rvalue),但这样可能会破坏现有代码。所以这可能至少在std2之前就不会发生,这允许在不破坏现有代码的情况下破坏std中的修订。