将auto关键字替换为推导的类型(clang或VS2010)

Replace auto keyword with deduced type (clang or VS2010)

本文关键字:类型 clang VS2010 关键字 auto 替换      更新时间:2023-10-16

是否有人编写了一个脚本、插件或可执行文件,用编译器推导的类型替换"auto"的每个实例?我需要移植一些在所有地方都使用auto的C++11代码。

Clang是我的第一个候选人。有人把它修改成这样吗?

另一种选择是将编译器中的错误解析为错误输出中的预期类型。我可以-Dauto=int并可能取回"could not convert std::vector<int>::iterator to 'int'"

不幸的是,这在一般情况下是不可能的。考虑:

template <typename T> void foo(T & t)
{
    auto it = t.find(42);
    ...
}
...
std::map<int, int> m;
std::set<int> s;
...
foo(m);
foo(s);

诚然,这是一个毫无意义的例子,但它表明,当依赖于模板参数时,无法知道用什么来替换auto。顺便说一句,std::mapstd::set包含相同名称的typedef(iterator),它们表示各自迭代器的类型,因此typename T::iterator it在这里可以工作,但您可以为没有此类typedef的T实例化foo

标准库类中的大量typedef正是为了允许在auto被发明/重新使用之前编写此类模板而添加的,对于没有auto的编译器,您也可以做同样的事情。但这不是一件可以自动化的事情,至少不需要像在编译器中添加对auto的支持那样努力。。。

即使auto不依赖于模板类型,也很难用对用户有意义且可移植的东西来替换它。Take:

std::map<int, int> m;
auto it = m.find(42);

auto的合理替换是std::map<int, int>::iterator,但如果您使用-Dauto=int并查看编译器错误消息,则会将其替换为类似std::_Rb_tree_iterator<std::pair<const int, int> >的内容。这是标准库的实现细节,很难阅读,显然不可移植——您不希望代码中出现。

在你的例子中,我的编译器(GCC 4.4.6)说:

错误:无法在初始化中将__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >转换为int