其他分享
首页 > 其他分享> > C 11中已删除成员函数的确切语义是什么?

C 11中已删除成员函数的确切语义是什么?

作者:互联网

struct A
{
    A();

    A(const A&);
    A& operator =(const A&);

    A(A&&) = delete;
    A& operator =(A&&) = delete;
};

struct B
{
    B();

    B(const B&);
    B& operator =(const B&);    
};

int main()
{
    A a;
    a = A(); // error C2280

    B b;
    b = B(); // OK
}

我的编译器是VC 2013 RC.

error C2280: ‘A &A::operator =(A &&)’ : attempting to reference a
deleted function

我只是想知道为什么编译器不会尝试A& operator =(const A&);当A& operator =(A&&)被删除了吗?

这种行为是由C标准定义的吗?

解决方法:

a = A(); // error C2280

右边的表达式是临时的,这意味着它将查找operator =(A&&)并看到它被删除.因此错误.没有进一步的搜索.

=删除并不意味着“不要使用我,而是使用下一个最好的”.这意味着,“当你需要我的时候不要用我 – 而是在野外独处.”

这是另一个例子.如果我希望我的类X的实例只用很长而没有其他类型创建(即使它转换为long!),那么我会将类X声明为:

struct X
{
     X(long arg); //ONLY long - NO int, short, char, double, etc!

     template<typename T>
     X(T) = delete;
};

X a(1);  //error - 1 is int 
X b(1L); //ok    - 1L is long

这意味着,重载分辨率在编译器看到= delete部分之前执行 – 因此导致错误,因为发现所选的重载被删除.

希望有所帮助.

标签:c,c11,language-lawyer,overloading,semantics
来源: https://codeday.me/bug/20190928/1826966.html