至少对于一元&
和一元-
,看来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;
}
答案 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&
。
在处理重载operator&
的类时,您可以使用std::addressof
来获取实例的地址。