重载减量运算符时,额外的参数是什么?

问题描述 投票:-1回答:4

当重载减量运算符时,我必须包括一个额外的参数:

#include <iostream>

template<class T>
class wrap
{
public:
    bool operator >(T &&v)
    {
        return value > v;
    }
    T operator --(int v) // Remove 'int v' and you get a compilation error
    {
        return (value -= 1) + 1;
    }
    wrap(T v)
    {
        value = v;
    }
private:
    T value;
};

int main(void)
{
    wrap<int> i(5);
    while(i --> 0)
        std::cout << "Why do we need the extra argument?\n";
    return 0;
}

如果删除此看似不必要的参数,则会出现编译错误:

test.cpp: In function ‘int main()’:
test.cpp:26:13: error: no ‘operator--(int)’ declared for postfix ‘--’ [-fpermissive]
     while(i --> 0)
           ~~^~

此参数用于什么目的?它的值代表什么?

c++ operator-overloading decrement postfix-operator
4个回答
1
投票

来自cppreference

int参数是一个虚拟参数,用于区分运算符的前缀和后缀版本。调用用户定义的后缀运算符时,尽管可以通过使用函数调用符号(例如a.operator++(2)operator++(a, 2))调用该运算符来更改该参数,但在该参数中传递的值始终为零。

尽管我强烈建议不要围绕这些显式调用进行功能(对于其他任何人,它看起来都非常怪异)。


0
投票

因为您使用的是后缀递减:


0
投票

operator++-pre-increment and post-increment有两个单独但相关的重载。两者都是可重写的。由于它们的名称相同,因此C ++的设计人员必须决定一种语法,以使编译器能够区分它们。他们选择在后递增运算符上使用虚拟int参数。


0
投票
尽管各版本之间的精确措词有所不同,但每个批准的ANSI和ISO C ++标准以及每个工作草案都对此进行了描述。
© www.soinside.com 2019 - 2024. All rights reserved.