【问题标题】:What has happened to this statement " auto iter = first"这个语句“auto iter = first”发生了什么
【发布时间】:2016-08-19 08:36:23
【问题描述】:

这句话怎么了:

auto iter = first;

为什么iter++可以很好用,众所周知,first就是const&

template<typename iteratorT, typename valueT>
iteratorT find(const iteratorT& first, const iteratorT& last,const valueT& value)
{
    auto iter = first;
    while(iter != last && *iter != value) iter++;
    return iter;
}

为什么?

【问题讨论】:

  • 类型推导:你得到了first的非常量副本。
  • 如果我不想使用自动,我该怎么办,谢谢
  • 如果您希望它成为 const 引用,请改用 const iteratorT&amp;const auto &amp;
  • decltype(first) iter = first;,现在你得到了一个const&amp;
  • decltype(auto)。在那里,保存了一封信。

标签: c++ iterator constants auto


【解决方案1】:

这就是使用auto 时类型推导的工作原理,在示例中,您将获得first 的副本,并且该副本的类型为iteratorT

你可以改用:

  • const iteratorT &amp;iter = first
  • const auto &amp;iter = first(或只是auto &amp;
  • decltype(first) iter = first
  • decltype(auto) iter = first

当然,如果您希望 iter 成为 const 引用,所有这些都是。

感谢@songyuanyao 和@LogicStuff 在 cmets 中提出的建议。


还请考虑以下以更简洁的方式重现您的问题的示例:

#include <type_traits>

int main() {
    int i = 42;
    const int & j = i;
    auto k = j;

    static_assert(std::is_same<decltype(k), int>::value, "!");
    static_assert(not std::is_same<decltype(k), const int &>::value, "!");
}

【讨论】:

  • 如果iter是一个const引用,“iter++”如何能很好地工作,
  • @z_chong 这就是我说的原因 - 当然,如果您希望 iter 成为 const 引用,所有这些都是。看起来这是您从问题中的意图,当然,除了它会破坏代码这一事实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
相关资源
最近更新 更多