一元+指针

LiK*_*Kao 12 c++ operator-overloading c++11

我只是浏览了C++ 11标准草案,发现了以下令人费解的声明(§13.6/ 8):

对于每种类型T,都存在表单的候选运算符函数

T* operator+(T*);
Run Code Online (Sandbox Code Playgroud)

如何理解指针上的"一元+"运算符?这只是正常情况下的无操作,但仍可能过载吗?或者我在这里缺少一些更深层次的观点?

ild*_*arn 8

您的问题的答案只是您引用的引文上方的页面 - §13.6/ 1:

表示本条款中定义的内置运算符的候选运算符函数在本子条款中规定.这些候选函数参与13.3.1.2中描述的运算符重载解析过程,并且不用于其他目的.[ 注意:因为内置运算符只接受具有非类型类型的操作数,并且仅当操作数表达式最初具有类或枚举类型时才会发生运算符重载解析,因此只有当操作数具有操作数时,运算符重载解析才能解析为内置运算符一种类型,具有用户定义的转换为适合于运算符的非类型类型,或者当操作数具有可以转换为适合运算符的类型的枚举类型时.另请注意,本子条款中给出的一些候选运算符函数比内置运算符本身更宽松.如13.3.1.2中所述,在通过重载解析选择内置运算符之后,表达式受第5章中给出的内置运算符的要求的约束,因此符合那里给出的任何其他语义约束.如果存在具有与内置候选运算符函数相同的名称和参数类型的用户编写候选,则内置运算符函数被隐藏并且不包括在候选函数集中.- 尾注 ]


Joh*_*itb 8

+指针上的是除了转弯的事情右值一个空操作.如果你想衰减数组或函数,它有时很方便

int a[] = { 1, 2, 3 };
auto &&x = +a;
Run Code Online (Sandbox Code Playgroud)

现在x是一个int*&&而不是一个int(&)[3].如果要传递x+a传递模板,这种差异可能会变得很重要.a + 0考虑并不总是等价的

struct forward_decl;
extern forward_decl a[];
auto &&x = +a; // well-formed
auto &&y = a + 0; // ill-formed
Run Code Online (Sandbox Code Playgroud)

最后一行是格式错误的,因为向指针添加任何内容都需要完全定义指针的指向类类型(因为它按sizeof(forward_decl) * N字节前进).

  • @LiKao 一点也不。`move` 保留类型,但仅更改值类别。因此,“move(a)”将产生“int[3]”类型的右值,而不是“int*”类型的右值。现在,将“move”应用于函数根本不会执行任何操作(转换为“FunctionType&&”会产生左值),而且我认为并不是特别有意义。 (2认同)