【问题标题】:Is there a feature of the compiler for substituting auto with the inferred type in C++?编译器是否有用 C++ 中的推断类型替换 auto 的功能?
【发布时间】:2020-11-06 08:14:02
【问题描述】:

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

是否有 gcc/clang 或其他工具/VSCode 扩展(用于 linux 或 macos)的功能将源文件作为输入并返回相同的源文件,但 auto 被其推断类型替换?

我尝试使用谷歌搜索,但我发现最接近的是 StackOverflow question,它没有回答我的问题。

【问题讨论】:

  • 如果您将鼠标悬停在其上,一个好的 IDE 应该会告诉您类型是什么。
  • @EnricoMariaDeAngelis VSCode 有时会这样做,但在 #ifdef 块这样的情况下,如果不满足 if 条件,它就不起作用。
  • 编译器通常不会修改源代码,这是编辑器、IDE 或其他编辑工具的工作。例如,ReSharper C++(一个 Visual Studio 扩展)似乎可以做到这一点:jetbrains.com/resharper-cpp/features > 例如,您可以快速将 auto 替换为显式类型或将 type 替换为 auto

标签: c++ linux macos clang++


【解决方案1】:

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

【讨论】:

  • MS 扩展程序也会在悬停时显示自动类型。
  • @sweenish 哦,好吧,我上次用它没用。
  • clangd 可能是 vscode 扩展所使用的,因为它可以像您所说的那样工作,但正如我在问题的评论中所说,对于 #ifdef blocks 或 auto [a,b,c] = f() 它不起作用.
  • @GerardoZinno,是的。 VSCode 使用 clangd。
  • @EnricoMariaDeAngelis 你知道是否有可能让它替代auto
【解决方案2】:

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

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

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

cmets 中的某个人说它应该用auto 代替T,因为这实际上是在我的小例子中发生的:auto 被推断为与T 被推断为相同的类型,在我看来,这只是意味着在此示例中autoT 扮演相同的角色,后者是编译器将使用的类型的“占位符”(也许这不是正确的术语)在每个呼叫站点进行推断。即使你用auto 代替T(在这个简单的例子中),你得到的信息比你拥有的多吗?什么都没有。

如果上面的main 改为

int main() {
    f(1);
}

然后是的,您或编译器可以用int(或其他)替换auto,但在原始代码中,不会有单个替换可以使所有三行都满意在main 里面。编译可以将整个模板函数替换为它需要的各种实例化序列。这些数量取决于在使用f 的整个代码库中传递给f 的不同类型的数量。

如果编写了一个库,里面有一个不错的模板函数,你不知道它会被哪些类型实例化,什么时候会在中使用它>我的代码;那你用什么替换Tauto

【讨论】:

  • 某些类型(如 lambdas)是独一无二的,难以描述的。
  • 您认为编译器应该为这段代码中的auto 推导出什么?更不用说@Suma 刚刚写的了。
  • 这总是可能的,但通常你会看到丑陋的内部类型名称,而不是暴露的接口。解析类型的规范名称实际上是棘手的部分。
  • 是的,你在说什么?模板函数也不例外,它们的代码会被复制并针对您拥有的每种类型使用进行调整。在每一个点上,每个变量都有硬的静态类型。
  • 也许这是一个更好的例子:godbolt.org/z/W839zj
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多