51 votes

En C++, que signifient les accolades à gauche d'une déclaration de variable ?

Le code à ce fichier GitHub utilise une syntaxe de "déclaration" de variable C++ que je ne connais pas :

std::unique_ptr<CRecentFileList> {m_pRecentFileList} = std::make_unique<CRecentFileList>(...

( m_pRecentFileList est déclarée dans une superclasse).

Qu'est-ce que cela signifie lorsque vous enveloppez une variable déclaration dans un appareil dentaire ? (pas une liste d'initialisation)


J'ai extrait un cas de test minimal qui compile :

class foo {
    int* p;
    void f(){
        std::unique_ptr<int> {p} = std::make_unique<int>(1);
    }
};

Changer int* p a std::unique_ptr<int> p crée une erreur de compilation due à unique_ptr(const unique_ptr&) = delete;

Cela me fait penser que la déclaration entre accolades assigne à une variable externe du même nom. J'ai essayé de créer un programme de test, mais il ne parvient pas à compiler :

int main(){
    int x;
    int {x} = 1;
}

error: using temporary as lvalue [-fpermissive]

47voto

T.C. Points 22510

Ce n'est pas une déclaration. C'est une affectation à un temporaire.

Sur std::unique_ptr<int> {p} = std::make_unique<int>(1); , std::unique_ptr<int> {p} crée un unique_ptr temporaire qui prend la propriété de l'objet p pointe vers, alors std::make_unique<int>(1) est affecté à ce temporaire, ce qui fait que l'objet p à supprimer et le temporaire à prendre la propriété de la int créé par le make_unique ; enfin, au ; le temporaire lui-même est détruit, en supprimant le fichier make_unique -créé int .

Le résultat net est delete p plus un cycle inutile de nouveau/suppression.

(Il s'agirait d'une déclaration si elle avait utilisé des parenthèses plutôt que des accolades : std::unique_ptr<int> (p) = std::make_unique<int>(1); est exactement équivalent à std::unique_ptr<int> p = std::make_unique<int>(1); .)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X