2017-07-20 3 views
4

J'ai lu Order of evalution de cppreference, mais je n'ai trouvé aucune règle concernant cette situation. Est-ce que cela signifie qu'il n'y a pas de relation séquence-avant ou est-ce que j'ai manqué quelque chose? Merci.Existe-t-il une relation séquence-avant entre l'évaluation des lhs de l'opérateur d'accès membre et les effets secondaires de ses arguments?

L'extrait de code suivant donne un exemple.

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

Répondre

6

Avant C++ 1Z NO, ne pas écrire cela.

Poster C++ 1Z oui, de [expr.call]

Le postfix-expression est séquencés avant chaque expression dans l'expression liste et tout argument par défaut.

expression Postfix est ici l'appel de fonction, d'où l'ordre d'exécution serait similaire à

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

Ce qui est bien sûr correct.

+1

Techniquement, vous citez [expr.call], en décrivant uniquement les expressions d'appel de fonction. Mais cette expression postfix spécifique se trouve être 'ptr-> func', donc elle est en effet séquencée avant la seule expression de la liste d'expressions – Cubbi

+0

@Cubbi Oups, ouais c'était une erreur. Bien que je me rappelle avoir vu la proposition originale en disant quelque chose comme ça. –