哪些特殊规则适用于一元和运算符?

What special rules apply to unary & operator?

提问人:Luchian Grigore 提问时间:10/22/2012 最后编辑:Matthieu M.Luchian Grigore 更新时间:10/22/2012 访问量:389

问:

是否有任何特殊规则适用于一元和运算符?

例如,代码:

#include <iostream>
struct X
{
    X() {}
    void* operator &() { return NULL; }
};
int main()
{
    const X x;
    std::cout << &x << std::endl;
    X y;
    std::cout << &y;
}

产生输出

0xbfbccb33
0

我知道这会像这样编译和运行,因为我之前在这里进行过讨论,但如果我不知道这一点,我会期望它无法编译,因为没有声明.operator &const

因此,无论是否重载,编译器都会生成。很好,这是有道理的,尤其是对于样本和输出。operator &() constoperator &()

问题是这种行为在标准中在哪里详细说明?

我不是在寻找重复我在问题中已经说过的内容的答案,所以请不要解释为什么我的重载运算符不能在对象上调用,因为我已经知道了。const

C++ 运算符重载

评论

4赞 10/22/2012
这就是 C++。我敢肯定,标准中有一些隐藏的细节、特殊规则、边缘情况或一些不为人所知的东西,但 Stroustrup 先生发现它很有用......
0赞 Luchian Grigore 10/22/2012
@H2CO3,这就是我要找的:)
0赞 WhozCraig 10/22/2012
Sry Luchian。没有看到那里的后缀。它必须包含在扣除和申报中。我也要去打猎。考虑到你是向我指出差异的人,至少我可以做到 =P
0赞 Luchian Grigore 10/22/2012
@WhozCraig既然你不打算问问题,我就问了。:P
1赞 Steve Jessop 10/22/2012
@J99:那里有冲突。类的作者通常不知道类的用户是“真的想要其对象的地址”,还是“想要对象的逻辑地址”。因此,要么在应该使用 / 的时候使用了很多损坏的代码,要么重载是错误的。从形式上讲,它是前者(代码依赖于获取地址,应该记录它必须记录),实际上它是后者(将重载类型传递到该代码中的人违反了隐式接口)。&std::addressofboost::addressofoperator&&operator&

答:

14赞 ForEveR 10/22/2012 #1

n3337 13.3.1.2/9

如果运算符是运算符 ,、一元运算符 & 或运算符 ->,并且没有可行的函数, 则假定该算子是内置算子,并根据第 5 条进行解释。

评论

0赞 WhozCraig 10/22/2012
我完全同意这个答案。可行性是问题所在,我相信它受运算符的隐式对象参数的约束,并在稍后的 13.3.1 中介绍。(4-5). 完全正确的答案,先生。+1!