这个成语是什么,什么时候应该使用?它解决了哪些问题?当使用C++ 11时,成语是否会改变?
虽然在许多地方已经提到过,但我们没有任何单一的"它是什么"问题和答案,所以在这里.以下是前面提到的地方的部分列表:
c++ c++-faq copy-constructor assignment-operator copy-and-swap
#include <vector>
struct A
{
    void foo(){}
};
template< typename T >
void callIfToggled( bool v1, bool &v2, T & t )
{
    if ( v1 != v2 )
    {
        v2 = v1;
        t.foo();
    }
}
int main()
{
    std::vector< bool > v= { false, true, false };
    const bool f = false;
    A a;
    callIfToggled( f, v[0], a );
    callIfToggled( f, v[1], a );
    callIfToggled( f, v[2], a );
}
上面示例的编译会产生下一个错误:
dk2.cpp: In function 'int main()':
dk2.cpp:29:28: error: no …为什么这段代码有效
std::vector<int> intVector(10);
for(auto& i : intVector)
    std::cout << i;
这不是吗?
std::vector<bool> boolVector(10);
for(auto& i : boolVector)
    std::cout << i;
在后一种情况下,我收到一个错误
错误:从'std :: _ Bit_iterator :: reference {aka std :: _ Bit_reference}'类型的右值开始,无效初始化'std :: _ Bit_reference&'类型的非const引用
Run Code Online (Sandbox Code Playgroud)for(auto& i : boolVector)
我想在一组值上迭代C++.在python中,它看起来像
for v in [v1, v2, v3]:
    do_something()
在C++中使用它的正确方法是什么?
std::vector<bool> 使用代理迭代器。 
因此,以下代码将无法编译(代码取自相关问题中已接受的答案):
vector<bool> v = {true, false, false, true};
for (auto& x : v)
    x = !x;
在相关问题中,已接受的答案指出,要就地修改向量的分量,我们必须使用
for (auto&& x : v)
    x = !x;
但如果我只是这样做:
for (auto x : v)
    x = !x;
这会产生相同的结果。那么&&不需要吗?
进一步为什么以下2个代码不修改组件?
for (bool &&x : v)
    x = !x;
和
for (bool x : v)
    x = !x;
昨天我花了差不多一个时间来调试这个东西,从那时起我就无法停止思考它。C
我尝试实现带有字符串索引的二维矩阵......
class CSqrMatrix(){
  ....
  void insert(string str){
     bool b = map.insert(str,m_size).second;
     if (b){
         m_size++;
         vector<int> ve;
         for (int i = 0; i < m_vect.size(); i++) 
             ve.push_back(m_default);
         m_vect.push_back(ve);
         for (auto v : m_vect)
             v.push_back(m_default);
     }
  ...
map<string,int> map;
vector < vector<int> > m_vect;
int m_default;
int m_size;
};
经过一些插入后,当我尝试到达类似的元素时
m_vect[0][0] = 8;
我遇到了无效的写入和段错误...并且 的值为m_vect[0].size()0;我尝试了一切,最后我将 for every 循环更改为普通循环,例如
for (int i = 0; i < m_vect.size(); i++){
     m_vect[i].push_back(m_default);
该程序运行良好...
那么这是否意味着,这v不是引用,而是元素的新副本?
谢谢(代码可能有错别字,我是在手机上写的……)
以下是基于C++范围的循环的示例,该循环按值捕获元素
vector<int> v = {1, 3, 5, 7, 9};
for (auto x : v)
    cout << x << ' ';
为什么甚至允许按价值捕获?这只是令人困惑和容易出错.如果弄错了,你会花很多钱.我无法想象任何无法通过显式创建副本而不是为您执行循环而无法解决的问题.有什么具体原因吗?我在这里错过了什么吗?
编辑
是的我知道函数允许传递值,但这对它有明显的好处.我要问的是,在for循环中是否有任何使用按值捕获的用法.我现在可以看到,这可以是bools和chars的有用序列.
给出问题的代码如下.我已经评论了哪些部分提供了正确的输出,哪些没有,但我不知道为什么,以及我应该如何正常访问类成员数据.我读到尝试在C风格循环中访问并不是很好,但我尝试使用迭代器只能遇到"错误:不匹配'运算符<='(操作数类型是'播放器'和'__gnu_cxx :: __ normal_iterator>')"
class Player
{
public:
    Player() {}
    Player(double strength) {}
    virtual ~Player() {}
    double GetStrength() const {
        return Strength;
    }
    void SetStrength(double val){
        Strength = val;
    }
    int GetRanking() const{
        return Ranking;
    }
    void SetRanking(int val){
        Ranking = val;
    }
    int GetATPPoints() const{
        return ATPPoints;
    }
    void SetATPPoints(int val){
        ATPPoints = val;
    }
protected:
private:
    double Strength; //!< Member variable "Strength"
    int Ranking; //!< Member variable "Ranking"
    int ATPPoints; //!< Member variable "ATPPoints"
};
int main()
{ …