في C++، يمكنك تحميل (أو تعريف) عامل السالب الأحادي (unary minus operator) للمرجعات الرائدة (rvalue references). لتحميل عامل السالب الأحادي، يمكنك استخدام دالة عضوية خاصة بالفئة (member function) أو دالة غير عضوية (non-member function). لكن يجب أن تتذكر أن التحميل ليس يمكن أن يعمل فقط على أساس نوع المرجع، ولكن أيضًا على أساس القيمة (value category) للمرجع.
لتحميل عامل السالب الأحادي للمرجعات الرائدة، يجب عليك تحميل الدالة باستخدام نوع القيمة المرجع إليه (reference collapsing)، وذلك باستخدام التحميل للأمام (forwarding reference) باستخدام std::forward
، كما هو موضح في المثال التالي:
cpp#include
struct Foo {
int value;
Foo(int value) : value(value) {}
// Member function for lvalue reference
Foo operator-() const& {
return Foo(-value);
}
// Non-member function for rvalue reference
friend Foo operator-(Foo&& foo) {
return Foo(-foo.value);
}
};
int main() {
Foo a(10);
Foo b = -a; // Calls Foo::operator-() const&
Foo c = -(a + b); // Calls the friend function operator-(Foo&&)
std::cout << "b.value: " << b.value << std::endl; // Output: -10
std::cout << "c.value: " << c.value << std::endl; // Output: 20
return 0;
}
يمكنك ملاحظة أننا نستخدم const&
لتحميل الدالة للمراجع الرائدة، ونستخدم &&
لتحميل الدالة للمراجع الرائدة.
المزيد من المعلومات
بالطبع! في الكود السابق، قمنا بتعريف هيكل Foo
الذي يحتوي على عضو value
من النوع int
. ثم قمنا بتحميل عامل السالب الأحادي لهذا الهيكل.
-
للحالة حيث نريد استخدام العامل السالب على متغير من نوع
Foo
(أي قيمة)، قمنا بتعريف دالة عضويةoperator-()
مستخدمة للمراجع الرائدة (lvalue reference). هذه الدالة تسترد نسخة جديدة منFoo
بقيمةvalue
سالبة. -
للحالة حيث نريد استخدام العامل السالب على قيمة مؤقتة (rvalue)، قمنا بتعريف دالة غير عضوية
operator-()
تستقبلFoo&&
وتسترد نسخة جديدة منFoo
بقيمةvalue
سالبة.
في الدالة الغير عضوية، نستخدم friend
لنجعل الدالة تستطيع الوصول إلى الأعضاء الخاصة (private members) لهيكل Foo
.
باستخدام هذا النوع من التحميل، يمكنك الآن استخدام العامل السالب الأحادي على المراجع الرائدة والقيم المؤقتة من نوع Foo
بنجاح.