C ++ 11 noexcept不会影响"复制/移动"在VC中的选择。这是一个VC错误吗?

时间:2016-06-17 01:04:11

标签: c++11 copy move push-back noexcept

[有效的现代C ++]说,

  1. vector :: push_back将在容量不足时分配新的内存块,然后"复制或移动"新块的元素
  2. 是否选择复制或移动取决于A级移动ctor有" noexcept"或不。当元素将其移动到新块时,这可以保证异常安全。
  3. 所以我做了一个实验

    #include<iostream>
    #include<vector>
    using namespace std;
    struct A{
        A(){}
        A(const A&){ cout << "copy ctor\n"; }
        A(A&&){ cout << "move ctor\n"; }
    };
    int main()
    {
        vector<A> vi(2);
        size_t c = 0;
        cout<<"========\n";
        for (size_t i = 0; i<4; ++i)
        {
            cout<<"push_back...........\n";
            vi.push_back(A());
            if (vi.capacity()>c)
            {
                c = vi.capacity();
                cout << c << endl;
            }
        }
        return 0;
    }
    

    GCC / clang运行它,push_back判断如果容量不够,所有元素都会被复制到新位置。如果我将移动ctor改为A(A&amp;&amp;)noexcept,那么它会调用移动ctor。 这与书中所说的完全相同

    但我测试了VC2013 / 2015:无论我添加了什么&#34; noexcept&#34;它是否会调用&#34;移动ctor&#34;并且永远不会复制ctor&#34;。 这是VC的错误,还是VC有编译选项来保证异常安全,但默认情况下不打开?

    感谢。

0 个答案:

没有答案