我认为当我删除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.
答案 0 :(得分:1)
仍然声明具有已删除定义的函数。除此之外,它通常会参与重载决策 - 但如果重载决议实际上选择它,程序就会形成错误( [dcl.fct.def.delete] / 2 ):
除了声明它之外,隐式或显式引用已删除函数的程序是不正确的。 [注意:这包括隐式或显式调用函数并形成指针或指向成员的指针 到功能。它甚至适用于未进行潜在评估的表达式中的引用。如果一个功能 重载,只有在通过重载决策选择函数时才会引用它。 -end note]
这与从未声明的函数不同。当然,不存在的声明不参与重载决策。