一个例子通常比长期解释更好.
您可以在Coliru上编译并运行此代码段.
(另一个前例子也可用)
#include <map>
#include <iostream>
struct MyClass
{
enum class …
Run Code Online (Sandbox Code Playgroud) std::vector<MyClass> vec;
for (auto &x : vec)
{
// x is a reference to an item of vec
// We can change vec's items by changing x
}
Run Code Online (Sandbox Code Playgroud)
要么
for (auto x : vec)
{
// Value of x is copied from an item of vec
// We can not change vec's items by changing x
}
Run Code Online (Sandbox Code Playgroud)
好.
当我们不需要更改vec
项目时,IMO,示例建议使用第二个版本(按值).为什么他们不提出const
引用的内容(至少我没有找到任何直接的建议):
for (auto const &x : vec) // <-- see …
Run Code Online (Sandbox Code Playgroud) (注意:这个问题是不必指定元素的数量,仍然允许直接初始化嵌套类型.)
这个问题讨论了C数组的用途int arr[20];
.在他的回答中,@ James Kanze展示了C阵列的最后一个据点,它具有独特的初始化特性:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Run Code Online (Sandbox Code Playgroud)
我们没有必要指定元素的数量,万岁!现在遍历它与C++ 11的功能std::begin
和std::end
从<iterator>
(或您自己的变体),你永远需要甚至认为它的大小.
现在,有没有(可能是TMP)方法实现同样的目标std::array
?使用宏可以使它看起来更好.:)
??? std_array = { "here", "be", "elements" };
Run Code Online (Sandbox Code Playgroud)
编辑:中间版本,从各种答案编译,如下所示:
#include <array>
#include <utility>
template<class T, class... Tail, class Elem = typename std::decay<T>::type>
std::array<Elem,1+sizeof...(Tail)> make_array(T&& head, Tail&&... values)
{
return { std::forward<T>(head), std::forward<Tail>(values)... };
}
// in code …
Run Code Online (Sandbox Code Playgroud) 那么为什么总是建议尽可能经常使用const呢?在我看来,使用const可能比C++中的帮助更痛苦.但话说回来,我是从python的角度来看这个:如果你不想改变某些东西,不要改变它.所以说,这里有几个问题:
似乎每次我将某些东西标记为const时,我都会收到错误,并且必须将某些其他函数更改为const.然后这导致我必须在其他地方更改另一个功能.这是通过经验变得更容易吗?
使用const的好处真的足以弥补麻烦吗?如果您不打算更改对象,为什么不编写不会更改它的代码?
我应该注意到,在这个时间点,我最关注的是使用const来实现正确性和可维护性的好处,尽管了解性能影响也很好.
有没有办法将enum class
字段转换为基础类型?我认为这将是自动的,但显然不是.
enum class my_fields : unsigned { field = 1 };
unsigned a = my_fields::field;
Run Code Online (Sandbox Code Playgroud)
该任务被海湾合作委员会拒绝.error: cannot convert 'my_fields' to 'unsigned int' in assignment
.
在C++ 11中,我可以迭代一些容器,如下所示:
for(auto i : vec){
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但我知道这是不必要的 - 不必要的,因为我只需要打印 -的值vec
- 制作(编辑:每个元素)的副本vec
,所以我可以这样做:
for(auto &i : vec){
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是我想确保它们的值vec
永远不会被修改并遵守const-correctness,所以我可以这样做:
for(const auto &i : vec){
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:如果我只需要查看某个容器的值,那么最后的循环(const auto &i
)是否总是首选,因为没有额外副本(编辑:每个元素)的效率提高vec
?
我正在开发一个我正在开发的程序,我正在考虑在整个过程中进行这种改变,因为效率是至关重要的(我在第一时间使用C++的原因).