2017-07-20 28 views
4

我已阅读cppreference的Order of evalution,但我找不到涉及此情况的任何规则。这是否意味着没有先后顺序的关系或者我错过了什么?谢谢。成员访问操作符的lhs评估与其参数的副作用之间是否存在先后顺序关系?

下面的代码片段给出了一个例子。

#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; 
} 

回答

6

此前C++ 1Z NO,不写。

邮政C++ 1Z是,从[expr.call]

后缀-表达在表达式列表和每个表达式中的任何默认参数之前测序。这里

后缀表达式是函数调用,因此执行的顺序将类似于

auto ptr_ = ptr.operator->(); 
auto func_ = &decltype(ptr)::element_type::func; 
ptr_->*func_(std::move(ptr)); 

这当然是正确的。

+1

从技术上讲,你只是引用[expr.call],只描述函数调用表达式。但是这个特定的后缀表达式恰好是'ptr-> func',所以它确实在表达式列表 – Cubbi

+0

@Cubbi Oops中的唯一表达式之前进行了排序,是的,这是一个错误。虽然我确实记得看到原来的提案这样说。 –