问题标签 [auto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 自动类型说明符
我刚刚了解了自动类型说明符,并尝试在一个非常简单的代码中使用它
运行时,此代码给出一个错误,提示“警告:'auto' 在 C++11 中改变含义;请删除它。
这里有什么问题?
c++ - 如何使用 auto 声明数组
我一直在玩,auto
我注意到在大多数情况下,您可以将变量定义替换为auto
然后分配类型。
在下面的代码中w
和x
是等效的(默认初始化int
,但不要进入潜在的副本)。有没有办法声明z
它具有与 相同的类型y
?
c++ - 通过迭代器从字符串中删除空格到 C++11 基于范围的 for 循环中的字符串
我只是想使用 C++11 的基于范围的 for 循环从字符串中删除所有空格;但是,我继续std::out_of_range
前进basic_string::erase
。
所以我想知道:i
前两个循环到底是什么?为什么它看起来既是 a char
(由 验证typeid
)又是iterator
a to a char
(与 一起使用std::string::erase
)?为什么它不等同iterator
于最后一个循环?在我看来,它们的功能应该完全相同。
c++ - C++11 基于范围的 for 循环效率“const auto &i”与“auto i”
在 C++11 中,我可以像这样迭代一些容器:
但我知道这是不必要的 -不必要的,因为我只需要打印-的值就vec
可以复制(编辑:每个元素)vec
,所以我可以这样做:
但我想确保 的值vec
永远不会被修改并遵守 const 正确性,所以我可以这样做:
所以我的问题是:如果我只需要查看某个容器的值,const auto &i
由于没有额外副本(编辑:每个元素)的效率提高,是否总是首选最后一个循环()vec
?
我有一个正在开发的程序,我正在考虑在整个过程中进行这种更改,因为效率在其中至关重要(我首先使用 C++ 的原因)。
c++ - 自动循环和优化
您能解释一下为什么使用以下代码(未优化)的计算时间存在如此大的差异。我怀疑 RVO 与移动构造,但我不太确定。
一般来说,遇到这种情况时的最佳做法是什么?初始化非 POD 数据时,循环中的自动声明是否被视为不好的做法?
在循环内使用 auto :
输出 :
./a.out 0.17s user 0.00s system 97% cpu 0.177 total
循环外的向量实例:
输出 :
./a.out 0.32s user 0.00s system 99% cpu 0.325 total
c++ - 返回值语法重载 const 而不是 const 函数
我在使用新的返回值语法为 const 而不是 const getter 函数提供正确重载时遇到问题。
在我的课堂PhysicalNode
上,我用新的返回值语法定义了一个 getter 函数。这是必需的,因为 getter 的返回类型取决于成员的类型。
但是,我现在还想将此方法提供为 const。
通常我会使用函数重载来定义我的 const 而不是像那样的 const getter 函数。
我尝试了以下函数声明,但它不起作用:
编译错误是:
我需要如何定义函数声明才能将此函数定义为常量。
c++ - 在函数模板中推断迭代器类型?
我试图在一个函数中推断出迭代器的类型,该函数已经用模板推断出参数的类型。我想要实现的是替换在C++11标准中具有类似功能的关键字auto 。最初我有以下功能:
这适用于C++11标准的完美编译。但是事情发生了变化,我不能再使用这些功能了。
我正在尝试在没有关键字auto的情况下实现相同的功能。所以我想到了模板。
到目前为止,我尝试的是这样的:
你会怎么解决这个问题?
注意:我通常用以下类型调用这个函数,
因为我必须实例化具有不同类型的向量。
c++ - 为什么必须包括使用汽车?
关于 SO已经有一个类似的问题,但我想强调braced-init-lists 的另一个方面。考虑以下:
除非包含标题,否则这是格式错误的 (8.5.4/2) <initializer_list>
。但为什么?标准说,模板std::initializer_list
不是预定义的。这是否意味着声明 (1) 引入了一种新类型?在所有其他情况下,auto
可以使用的地方,例如
whereexpr
是一个表达式,自动推导的类型已经存在。另一方面,从逻辑的角度来看,编译器必须为构造分配一个隐式类型{1}
,std::initializer_list
然后是另一个名称。但在声明 (1) 中,我们不想命名这种类型。那么为什么必须包含此标头。也有类似的情况nullptr
。它的类型隐含存在,但要明确命名它,您必须包含<cstddef>
.
c++ - 为什么 auto 不能用于重载函数?
我知道 usingtemplates
是一种受欢迎的重载方式,但我想知道为什么auto
不能用于函数参数类型推导从而帮助函数重载?
N3690
在 7.6.1.4/3 中说 lambda 表达式可以使用 auto 进行泛型,提供这个例子
(注意:N3485中没有提到这个)
1).为什么我不能为正常功能做类似的事情,例如
这给出了错误error : parameters declared auto
。
从 N3690 7.1.6.4/4
使用 auto 或 decltype(auto) 声明的变量的类型是从其初始化程序推导出来的。在块 (6.3)、命名空间范围 (3.3.6) 和 for-init-statement (6.5.3) 中声明变量时,允许使用此用法。[...]
我是否错误地假设param1
andparam2
属于块范围并因此有资格自动扣除?
2)。如果允许这样的功能,会有什么陷阱?
我正在使用 gcc 4.8.1。
谢谢