2016-05-30 15 views
6

Da boost/filesystem/path.hpp:Perché boost :: filesystem :: path :: string() restituisce per valore su Windows e per riferimento su POSIX?

# ifdef BOOST_WINDOWS_API 
    const std::string string() const 
    { 
     [...] 
    } 
# else // BOOST_POSIX_API 
    // string_type is std::string, so there is no conversion 
    const std::string& string() const { return m_pathname; } 
    [...] 
# endif 

Per wstring() è esattamente il contrario - restituzione per riferimento su Windows e per valore su POSIX. C'è una ragione interessante per questo?

risposta

7

Su Windows, path memorizza un wstring, poiché l'unico modo per gestire i percorsi codificati in Unicode in Windows è con UTF-16. Su altre piattaforme, i filesystem gestiscono Unicode tramite UTF-8 (o abbastanza vicino), quindi su tali piattaforme, path memorizza un string.

Quindi su piattaforme non Windows, path::string restituirà un riferimento costante alla struttura dati interna effettiva. Su Windows, deve generare un std::string, quindi lo restituisce per copia.

Si noti che il limite File System TS per C++ 17 non esegue questa operazione. Lì, path::string restituirà sempre una copia. Se si desidera il tipo di stringa memorizzato in modo nativo, è necessario utilizzare path::native, il cui tipo dipenderà dalla piattaforma.

1

Per Windows API restituisce il valore in quanto la variabile 'm_pathname' deve essere convertita in un formato diverso (stringa) come implementato da 'path_traits'. Questo introduce una variabile temporanea che ovviamente non può essere passata per riferimento, sebbene la copia extra venga eliminata da NRVO o da mossa implicita.

Per il caso posix, il formato di 'm_pathname' è già in formato nativo (stringa), quindi non è necessario convertirlo e quindi può essere passato come riferimento const.

Problemi correlati