Ответ 1
Это поведение является законным и четко определено в 13.5.7:
Вызов оператора ++ явно, как в выражения, подобные a.operator ++ (2), имеют никаких специальных свойств: аргумент оператор ++ равен 2.
Я не использую этот код в любой производственной среде, это просто для моего понимания. Является ли этот код действительным (т.е. Можно определить мой постфиксный оператор следующим образом?):
class A
{
public:
A& operator++(int n)
{
std::cout<<"N is:"<<n<<"\n";
return *this;
}
};
int main()
{
A a;
a++;
a.operator ++(10);
}
На VS2008 я получаю вывод как:
N равно 0
для первого вызова и
N равно 10
для второго вызова
Это поведение является законным и четко определено в 13.5.7:
Вызов оператора ++ явно, как в выражения, подобные a.operator ++ (2), имеют никаких специальных свойств: аргумент оператор ++ равен 2.
a++
эквивалентен a.operator++(0);
. Ваш код действителен
13.5/7
Когда приращение постфикса вызывается в результате использования оператора ++, int аргумент будет иметь нулевое значение.
Да, это верный int как параметр, он только параметр принуждения политики для различения операторов префикса и постфикса. Прошедший параметр будет принят в качестве аргумента, который является поведением, которое вы видите, и это поведение, определяемое с точки зрения конфиденциальности.