不能只删除方法的const重载吗?

时间:2016-12-17 00:09:52

标签: c++ c++11 operator-overloading overloading

至少对于一元&和一元-,看来GCC只允许你删除运算符的非const和const版本或者没有(它可能会影响二元运算符但是我没有&# 39; t检查)。如下面的注释所述,虽然我可以基于const成功重载,但是我不能单独删除const或非const重载而不会遇到编译错误。此行为符合标准吗?这似乎违反直觉。

使用GCC 5.4.0测试。

#include <iostream>

struct A {
    // These both being defined at the same time is fine,
    // and whether or not x is const as expected will change
    // which overload you get.

    A* operator&() {
        std::cout << "hello" << std::endl;
        return this;
    }

    const A* operator&() const {
        std::cout << "world" << std::endl;
        return this;
    }



    // assuming both definitions above are commented out,
    // regardless of whether or not x is const
    // either one of these lines being present
    // will make the example not compile!

    // A* operator&() = delete;
    // const A* operator&() const = delete;



    // Finally if you have the const version defined and the non-const version deleted
    // or vice versa, it will compile as long as the one that you have defined
    // matches the constness of x.
};

int main(int argc, char** argv)
{
    A x;
    std::cout << &x << std::endl;
    return 0;
}

1 个答案:

答案 0 :(得分:4)

内置operator&未参与重载解析([over.match.oper]/3.3)。

  

对于operator , unary operator & operator ->,内置候选项集为空。

假设您声明删除了

下面的重载
const A* operator&() const = delete;

无论您是尝试使用const还是非const A的地址,上面的声明都是唯一可行的候选者,从而导致编译错误。

如果您对其进行评论,则会根据[over.match.oper]/9找到内置的operator&

  

如果运营商是operator , unary operator & ,或operator ->,并且没有可行的功能,则运营商是假设是内置运算符并根据Clause [expr]进行解释。

现在,如果您声明已删除非const仅重载

A* operator&() = delete;

这不能在const A对象上调用,因此它不会是一个可行的候选者,并且会找到内置的operator&

Live demo

在处理重载operator&的类时,您可以使用std::addressof来获取实例的地址。