这个语句“auto iter = first”发生了什么
What has happened to this statement " auto iter = first"
这个语句发生了什么:
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;
}
为什么?
这就是使用 auto
时类型推导的工作方式,在示例中,您将获得 first
的副本并且该副本的类型为 iteratorT
.
您可以改用:
const iteratorT &iter = first
const auto &iter = first
(或 auto &
)
decltype(first) iter = first
decltype(auto) iter = first
当然,如果您希望 iter
成为 const 引用,则所有这些都可以。
感谢@songyuanyao和@LogicStuff在评论中提出的建议
另请考虑以下以更清晰的方式重现您的问题的示例:
#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, "!");
}
这个语句发生了什么:
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;
}
为什么?
这就是使用 auto
时类型推导的工作方式,在示例中,您将获得 first
的副本并且该副本的类型为 iteratorT
.
您可以改用:
const iteratorT &iter = first
const auto &iter = first
(或auto &
)decltype(first) iter = first
decltype(auto) iter = first
当然,如果您希望 iter
成为 const 引用,则所有这些都可以。
感谢@songyuanyao和@LogicStuff在评论中提出的建议
另请考虑以下以更清晰的方式重现您的问题的示例:
#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, "!");
}