编译器是否具有用 C++ 中的推断类型替换 auto 的功能?

Is there a feature of the compiler for substituting auto with the inferred type in C++?

auto 使用起来很舒服,但有时,为了编程时的易读性,我更愿意将推断类型写在源代码中,而不是自动编写。

是否有 gcc/clang 或其他一些 tool/VSCode 扩展(用于 linux 或 macos)的功能将源文件作为输入并吐出相同的源文件,但auto 替换为它的推断类型?

我试过谷歌搜索,但我发现的最接近的东西是这个 Whosebug question,它没有回答我的问题。

一般来说,这并不总是可行的。在以下情况下,编译器无法将 auto 替换为 one 类型,因为实际上实例化了 3 个不同的函数。

template<typename T>
auto f(T x) {
    auto y = x;
    return y;
}

int main() {
    f(1);
    f('c');
    f("c");
}

评论中有人说它应该用 auto 代替 T,因为这实际上是我的简单示例中发生的情况:auto 被推断为相同类型 因为T被推导为,在我看来这只是意味着在这个例子中auto扮演着与T相同的角色,即“占位符”(也许这不是正确的术语)编译器将在每个调用站点推断出的类型。即使你用 auto 代替 T(在这个简单的例子中),你得到的信息比你得到的多多少?没有。

如果上面的main改为

int main() {
    f(1);
}

那么是的,你或编译器可以用 int(或其他)替换 auto,但在原始代码中,不会有 single 替换将使 main 中的所有三行都快乐。编译可以用它需要的各种实例的序列替换整个模板函数。这些的数量取决于在使用 f.

的整个代码库中有多少不同类型传递给 f

如果写了一个库,里面有一个很好的模板函数,你无法知道它将用哪些类型实例化,当I 将在 my 代码中使用它;那么你用什么代替 Tauto

结合使用 clang 作为编译器,您使用 clangd 进行自动完成,...它会在鼠标悬停时显示 auto 的类型(只要它不依赖于模板变量)