C++ - Hur bör man skriva "Passing by reference to Const"?

Permalänk
Medlem

C++ - Hur bör man skriva "Passing by reference to Const"?

Hej,

Jag undrar kort hur bör man skriva "Passing by Reference to Const"? Jag har sett dessa två exempel:

//Exempel 1: try { std::cout << "File size (binary prefix): " << prefix::to_binary_prefix(std::filesystem::file_size(p)) << '\n'; } catch (const std::filesystem::filesystem_error& e) { std::cout << e.what() << '\n'; } //Exempel 2: try { std::cout << "File size (binary prefix): " << prefix::to_binary_prefix(std::filesystem::file_size(p)) << '\n'; } catch (std::filesystem::filesystem_error const& e) { std::cout << e.what() << '\n'; }

Är de likvärdiga i bemärkelsen att kompilatorn tolkar dem på samma sätt?

Permalänk
Medlem
Skrivet av Apollo11:

Hej,

Jag undrar kort hur bör man skriva "Passing by Reference to Const"? Jag har sett dessa två exempel:

//Exempel 1: try { std::cout << "File size (binary prefix): " << prefix::to_binary_prefix(std::filesystem::file_size(p)) << '\n'; } catch (const std::filesystem::filesystem_error& e) { std::cout << e.what() << '\n'; } //Exempel 2: try { std::cout << "File size (binary prefix): " << prefix::to_binary_prefix(std::filesystem::file_size(p)) << '\n'; } catch (std::filesystem::filesystem_error const& e) { std::cout << e.what() << '\n'; }

Är de likvärdiga i bemärkelsen att kompilatorn tolkar dem på samma sätt?

Same same, upp till din kodstil/preferens

https://stackoverflow.com/a/3695979/6019661

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

Permalänk
Medlem
Skrivet av Pamudas:

Same same, upp till din kodstil/preferens

https://stackoverflow.com/a/3695979/6019661

Tack! Min lärobok/referensverk använder sig av Exempel 2 vilket var varför jag frågade.

Permalänk
Hedersmedlem

Intressant, har inte sett typ 2 förut överhuvudtaget och visste inte att det var tillåtet (och dessutom samma sak -- med pekare kan const ha olika betydelser på olika ställen, som int * const a mot const int *a). Exempel 1 känns överlägset vanligast och är vad jag skulle förvänta mig.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Datavetare
Skrivet av Apollo11:

Tack! Min lärobok/referensverk använder sig av Exempel 2 vilket var varför jag frågade.

"Tricket" för att lura ut vad en deklaration betyder i språk som C, C++, C#, Java, m.fl. är att läsa det hela höger-till-vänster.

// Variant 1 reads a bit "odd" foo(const T & varName); // varName is a reference to a T that is const // Variant 2 is a lot more natural foo(T const & varName); // varName is a reference to a constant T // Variant 3 is a also fine foo(T & const varName); // varName is a constant reference to a T

Använder också typiskt variant 1, men tänker man lite på det hela är variant 2 den lite mer logiska varianten.

Kvittar om det är en referens (&) eller pekare (*), fungerar på samma sätt. Orsaken verkar, som mycket annat, vara att de tidiga C++ kompilatorerna (innan det fanns en formel standard) parsade koden på ett sätt då det bara spelade roll vad som stod före resp. efter */&, men ordningen mellan av de saker som var före/efter hade i praktiken ingen effekt.

Lite förvånande att det tog så lång tid att "rätta till" misstaget i C med att deklarationerna är baklänges (blir snabbt väldigt svårt att reda ut vad något betyder för mer komplexa fall). De flesta lite mer populära språk skapade efter millenieskiftet har rättat detta misstag, Swift, Go, Rust, m.fl. har semantik som gör att man bara läser vänster-till-höger

func foo(varName []T) func(int) string {... // foo takes varName that is an array of T, // foo returns a function that takes an int and returns a string

Många nyare språk har rätt till 'måste läsa höger-till-vänster'
Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer