成员访问运算符的 lhs 求值与其参数的副作用之间是否存在先序关系?
Is there a sequenced-before relationship between the evaluation of the lhs of the member access operator and the side-effects of its arguments?
我已从 cppreference 中阅读 Order of evalution,但我找不到任何与这种情况有关的规则。这是否意味着没有 sequenced-before 关系或者我错过了什么?谢谢
下面的代码片段给出了一个例子。
#include <memory>
struct Foo {
void func(std::unique_ptr<Foo>) {}
};
int main() {
auto ptr = std::make_unique<Foo>();
ptr->func(std::move(ptr)); // Is this valid?
return 0;
}
之前的 C++1z NO,不要写那个。
Post C++1z 是的,来自 [expr.call]
The postfix-expression is sequenced before each expression in the expression-list and any default argument.
Postfix expression 这里是函数调用,因此执行顺序与
类似
auto ptr_ = ptr.operator->();
auto func_ = &decltype(ptr)::element_type::func;
ptr_->*func_(std::move(ptr));
这当然是正确的。
我已从 cppreference 中阅读 Order of evalution,但我找不到任何与这种情况有关的规则。这是否意味着没有 sequenced-before 关系或者我错过了什么?谢谢
下面的代码片段给出了一个例子。
#include <memory>
struct Foo {
void func(std::unique_ptr<Foo>) {}
};
int main() {
auto ptr = std::make_unique<Foo>();
ptr->func(std::move(ptr)); // Is this valid?
return 0;
}
之前的 C++1z NO,不要写那个。
Post C++1z 是的,来自 [expr.call]
The postfix-expression is sequenced before each expression in the expression-list and any default argument.
Postfix expression 这里是函数调用,因此执行顺序与
类似auto ptr_ = ptr.operator->();
auto func_ = &decltype(ptr)::element_type::func;
ptr_->*func_(std::move(ptr));
这当然是正确的。