后备复制构造函数不工作?

时间:2015-04-26 15:49:12

标签: c++ c++11 copy-constructor c++14 move-semantics

我认为当我删除B中的移动构造函数时,下面的代码仍然可以正常编译,因为它仍然应该使用复制构造函数来构造B个对象。为什么编译器现在抱怨。没有=delete它没有,并且无论如何都要调用复制构造函数,因为它不允许提供默认的移动构造函数!)

class B{
    public:
    B(){}
    ~B(){}
    B & operator=(const B & b){
        std::cout << " cannot move -> copy " << std::endl; 
        return *this;
    }
    B(const B & v){
        std::cout << " cannot move -> copy " << std::endl;        
    }

    // B(B && b) = delete; // uncomment this!
};


int main()
{
    B b( B{} ); 
}

编译器输出与clang 3.6(Live code

main.cpp:27:7: error: call to deleted constructor of 'B'

    B b( B{} );

      ^  ~~~

main.cpp:21:5: note: 'B' has been explicitly marked deleted here

    B(B && b) = delete;

    ^

1 error generated.

1 个答案:

答案 0 :(得分:1)

仍然声明具有已删除定义的函数。除此之外,它通常会参与重载决策 - 但如果重载决议实际上选择它,程序就会形成错误( [dcl.fct.def.delete] / 2 ):

  

除了声明它之外,隐式或显式引用已删除函数的程序是不正确的。    [注意:这包括隐式或显式调用函数并形成指针或指向成员的指针   到功能。它甚至适用于未进行潜在评估的表达式中的引用。如果一个功能   重载,只有在通过重载决策选择函数时才会引用它。 -end note]

这与从未声明的函数不同。当然,不存在的声明不参与重载决策。