首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中强制类型扣减的实例

C++中强制类型扣减的实例
EN

Stack Overflow用户
提问于 2020-07-16 23:36:58
回答 4查看 152关注 0票数 2

谷歌C++风格指南在某一点上声明:

在几个上下文中,C++允许(甚至需要)编译器推导类型。

强制类型扣减的一些例子是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-07-17 00:23:13

一个简单的例子是初始化lambda变量。lambda的类型是匿名的,因此不能显式命名,必须推断:

代码语言:javascript
复制
auto var = [capture]{};
票数 2
EN

Stack Overflow用户

发布于 2020-07-17 00:29:04

另一个例子是:

代码语言:javascript
复制
struct {
    int x, y;
} g_xy;

这里,g_xy是一个未命名类型的全局变量。例如,如果您试图返回它,就必须让编译器推断函数的返回类型,因为您不能命名它:

代码语言:javascript
复制
auto foo()
{
    return g_xy;
}

尽管可能的未命名类型(lamdas除外)很少有用和使用。

票数 1
EN

Stack Overflow用户

发布于 2020-07-17 03:53:12

样式指南给出了编译器进行自动类型推断的几个示例。最明显的情况是,当您使用auto关键字时,C++11引入了autoauto是实际类型的占位符。无论何时使用auto,编译器都会从以下几个方面推导出类型:用于使变量无效的表达式类型;函数的尾部类型或返回表达式的类型。

通常,您会声明如下所示的变量:

代码语言:javascript
复制
int i = 0;

其中为变量int指定类型i。但是,在现代C++中,您可以声明变量而不指定它们的类型,编译器将自动推断它们的类型:

代码语言:javascript
复制
auto a = 42;         // a is an int
auto& b = a;         // b is an int&
auto c = b;          // c is an int
auto d{42};          // d is an int, not a std::initializer_list<int>
auto v = {1, 2, 3};  //v is a std::initializer_list<int>

其他示例包括一个命名的lambda函数:

代码语言:javascript
复制
auto lower = [] (const char c) { return tolower(c); };

在C++14中,返回类型和lambda参数都可以是auto的泛型lambda。

代码语言:javascript
复制
auto add = [](const auto a, const auto b) { return a + b; }

需要注意的一点是,auto是类型的占位符,而不是constvolatile或引用规范的占位符。

使用auto的一些优点包括:

  • 变量总是初始化的。
  • 确保使用正确的类型而不进行任何隐式转换。
  • 减去键入和关注实际类型
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62945023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档