يرجى الإجابة على السؤال التالي.

عنوان السؤال: ترتيب التقييم في v != std::exchange(v, السلف(v))

نص السؤال: ما زلت أجد المزيد من التعابير التي تناسب std::exchange.

اليوم وجدت نفسي أكتب هذا في إجابة:

يفعل {
 path.push\_front(v);
} while (v != std::exchange(v, pmap[v]));
أنا أحب ذلك أكثر بكثير من، على سبيل المثال

يفعل {
 path.push\_front(v);
 إذا (v == pmap[v])
 استراحة؛
 v= pmap[v];
} احيانا صحيح)؛
نأمل لأسباب واضحة.

ومع ذلك، فأنا لست مهتمًا بالمعايير ولا يسعني إلا أن أقلق من أن lhs != rhs لا يضمن عدم تقييم تعبير الجانب الأيمن بشكل كامل قبل الجانب الأيسر. وهذا من شأنه أن يجعلها مقارنة مبتذلة - والتي بحكم التعريف ستكون صحيحة.

ومع ذلك، فإن الكود يعمل بشكل صحيح، ويبدو أنه يقوم بتقييم lhs أولاً.

هل يعلم أحد

ما إذا كان المعيار يضمن أمر التقييم هذا
إذا كانت قد تغيرت في المعايير الأخيرة، أي إصدار قياسي حددها أولاً؟
ملاحظة. أدرك أن هذه حالة خاصة لـ f(a,b) حيث f عامل تشغيل!=. لقد حاولت الإجابة على استفساري باستخدام المعلومات الموجودة هنا ولكني فشلت في التوصل إلى نتيجة حتى الآن:

https://en.cppreference.com/w/cpp/language/eval\_order
https://en.wikipedia.org/wiki/Sequence\_point
ترتيب التقييم في معلمات دالة C++
ما هي ضمانات أمر التقييم التي تقدمها C++ 17؟
{"evolved_from": null, "kind": "human", "source": "ewof/sharegpt-instruct-unfiltered-deduped"}