Четко ли определен следующий код в C++20 или его поведение неопределенно в зависимости от операции секвенирования?
#include <iostream>
#include <memory>
using namespace std;
struct A {
A(int i) : a_(i) {}
int Foo(unique_ptr<A>) { return a_; }
int a_ = 0;
};
int main() {
auto a_ptr = make_unique<A>(10);
cout << a_ptr->Foo(std::move(a_ptr)) << '\n';
}
В C++17 в этой статье предлагается более строгий порядок вычисления выражений.
a->b заказ (a до b) является частью этого.
Означает ли это, что в данном случае a_ptr->Foo(std::move(a_ptr)) следует расположить следующим образом:
A* a_ptr_raw = a_ptr.operator->();
a_ptr_raw->Foo(std::move(a_ptr));
что сделает это четко определенным.
@ 273K Я думаю, это означает «Со ссылкой на».
@273K Традиционное значение (с 1950-х годов) — «по отношению к», но, похоже, оно трансформируется в «по отношению к» под влиянием социальных сетей.
Меня уже смущает семантика того, что вы пытаетесь сделать (и это еще до того, как порядок оценки вступит в игру). Единственное семантическое значение, которое я могу придать этому коду, — это то, что вы пытаетесь продлить время жизни объекта до конца вызова Foo. Но опять же в этом игрушечном примере... даже это не имеет смысла.
@PepijnKramer Я предполагаю, что это академический пример «языкового юриста», а не проблема реального мира.
@joergbrech Возможно, предположения тоже могут быть рискованными;) По крайней мере, в любом случае было бы неплохо иметь более семантически значимый пример.
@273K Это «относительно» очень распространено в индийских учебниках и т. д.
@user12002570 user12002570 «относительно», «относительно», «относительно». Следует быть осторожным с межкультурным использованием, язык и термины мутируют и развиваются в родной среде, в то время как неродная академическая среда может застрять в прошлом.





Да, это четко определено... но не интуитивно понятно.
Похоже, что авторы цитируемой вами статьи хотели заставить некоторые примеры работать правильно (т.е. заставить их делать то, что люди ожидают интуитивно), например этот:
std::string s = “but I have heard it works even if you don’t believe in it”;
s.replace(0, 4, “”).replace(s.find(“even”), 4, “only”).replace(s.find(“ don’t”), 6, “”);
assert(s == “I have heard it works only if you believe in it”); // OK.
При этом некоторые запутанные утверждения становятся «четко определенными», но это не делает их менее запутанными. Ваш пример напоминает печально известный:
*x = *x++ + 1;
Что такое w.r.t??