使用C++ 11基于范围的正确方法是for什么?
应该使用什么语法?for (auto elem : container),for (auto& elem : container)或者for (const auto& elem : container)?还是其他一些?
Scott Meyers的书第18项有效STL:50改进您对标准模板库的使用的具体方法说避免vector <bool>因为它不是STL容器而且它实际上并不存在bool.
以下代码:
vector <bool> v;
bool *pb =&v[0];
Run Code Online (Sandbox Code Playgroud)
不会编译,违反STL容器的要求.
错误:
cannot convert 'std::vector<bool>::reference* {aka std::_Bit_reference*}' to 'bool*' in initialization
Run Code Online (Sandbox Code Playgroud)
bool返回类型应该是T&,但为什么它是特殊情况vector<T>::operator []?
什么是T&真正组成的呢?
该项目进一步说:
deque<bool> v; // is a STL container and it really contains bools
Run Code Online (Sandbox Code Playgroud)
这可以用作替代品vector<bool>吗?
有人可以解释一下吗?
我记得曾经有人告诉我,
"不需要基于
auto内部范围的for循环.如果我们要删除它,那么语言就 不会含糊不清."
这是真实的陈述吗?
以下代码是否有效的C++语法?
for (elem : range){...}
Run Code Online (Sandbox Code Playgroud)
我原以为这已经是有效的语法,但是当我去编译时
clang++ --std=c++1z,我出现了以下错误:
range-based for loop requires type for loop variable
for (elem: range){
Run Code Online (Sandbox Code Playgroud)
编译器仍然将其识别为基于范围的for循环,那么为什么它也不能导出类型呢?
使用旧式循环,我可以深入研究 aQJsonArray并在下面的示例中为每个数组项添加元素“foo”和现有元素“bar”的内容。我如何使用基于 C++11 的范围来做到这一点?
// QJsonArray oldArray contains an array of which one element is "bar"
QJsonArray newArray;
int i, b = oldArray.count();
for (i=0; i<n; ++i) {
QJsonObject element = oldArray.at(i).toObject();
element["foo"] = element["bar"];
newArray.append(element);
}
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法(无可否认是反复试验):
for (auto& element : oldArray) {
element["foo"] = element["bar];
newArray.append(element);
}
Run Code Online (Sandbox Code Playgroud)
我收到错误
对类型“QJsonValueRef”的非常量左值引用无法绑定到“QJsonValueRef”类型的临时变量
for (const auto& element : oldArray) {
...
Run Code Online (Sandbox Code Playgroud)
我收到警告
循环变量“元素”始终是副本,因为“QJsonArray”类型的范围不返回引用
for (const auto element : oldArray) {
element["foo"] = element["bar];
...
Run Code Online (Sandbox Code Playgroud)
我收到错误
'const QJsonValueRef' …