为什么decltype()符合参考的指针



我正在尝试更好地了解iterator_traits,并在C 教科书上找到了代码段。因此,我添加了一些代码以使其可执行,以了解该编译时间机制的行为。完整的程序看起来像:

template<typename C>
    using Iterator_type = typename C::iterator;  
template<typename Iter>
    using Iterator_category = typename std::iterator_traits<Iter>::iterator_category;   
template<typename Ran>                                          
void sort_helper(Ran beg, Ran end, std::random_access_iterator_tag)   
{
    sort(beg, end);   
}
template<typename For>                                     
void sort_helper(For beg, For end, std::forward_iterator_tag)   
{
    std::vector<decltype(*beg)> v {beg, end};   
    sort(v.begin(), v.end());
    copy(v.begin(), v.end(), beg);              
}
template<typename C>
void sort(C& c)
{
    using Iter = Iterator_type<C>;
    sort_helper(c.begin(), c.end(), Iterator_category<Iter>{});
}
void test(std::vector<std::string>& v, std::forward_list<int>& lst)
{
    sort(v);     
    sort(lst);   
}
template<typename C>
void print(C& c)
{
    for(auto it = c.begin(); it != c.end(); ++it) {
        std::cout << *it << 'n';
    }
    std::cout << 'n';
}
int main()
{
    std::vector<std::string> v { "Bicycle", "Hoovercraft", "Rocket", "Airplaine", "Bus", "Submarine" };
    print(v);
    sort(v);
    print(v);
    std::forward_list<int> lst { 2, 81, 3, 0, 4, 34, 23, 11 };
    print(lst);
    sort(lst);
    print(lst);
    return 0;
} 

汇编未能说明给出参考指针:

memory:1723:16: error: 
  'pointer' declared as a pointer to a reference of type 'int &'
typedef _Tp*              pointer;

,错误堆栈将以下行带来:

in instantiation of template class 'std::__1::vector<int &,     std::__1::allocator<int &> >'
  requested here
std::vector<decltype(*beg)> v {beg, end};

Mac OS linux 机器上的此编译,带有 g

我设法进行了工作,以修改所涉及的部分,例如:

auto i = *beg;
std::vector<decltype(i)> v {beg, end};

您能给我一个更清楚的解释,说明为什么decltype()功能将指针返回参考的指针?我已经阅读了有关decltype类型功能的其他问题,并且还读过规格,但既不使我走上正确的路径,也没有检查输出消息的完整编译器堆栈,这是任何帮助。

预先感谢您的任何考虑。

问题是 decltype产生了参考类型(您无法制作std::vector)。
为什么在此处回答SO。

您可以通过两种方法之一进行修复:

  • 使用std::remove_reference<decltype(*beg)>::type
  • 使用std::iterator_traits<For>::value_type

相关内容

  • 没有找到相关文章

最新更新