Zainteresowała mnie książka "The modern C++ Challenge" i postanowiłem znaleźć jakieś przykłady czego mogę się po niej spodziewać. Włączyłem przykład 15 polegający na implementacji klasy reprezentującej adres ipv4. Kod autora znalazłem tutaj https://github.com/PacktPublishing/The-Modern-Cpp-Challenge/blob/master/Chapter02/problem_15/main.cpp
Moje wątpliwości wzbudziły dwie rzeczy:
1.
constexpr ipv4(unsigned char const a, unsigned char const b,
unsigned char const c, unsigned char const d): data{{a,b,c,d}} {}
Po co argumenty są oznaczone const
?
- W jakim celu zostało zdefiniowane kopiowanie? Z tego co widzę implementacja jest taka sama jak generowana przez kompilator, a dodatkowo dochodzi do niejawnego usunięcia konstruktora i operatora przenoszącego, jeżeli taki był cel autora to czy nie powinno to być zrobione jawnie?
ipv4(ipv4 const & other) noexcept : data(other.data) {}
ipv4& operator=(ipv4 const & other) noexcept
{
data = other.data;
return *this;
}
Cepoipv4(ipv4 const & other) noexcept = default;
iipv4& operator=(ipv4 const & other) noexcept = default;
alagnerdata
może rzucić to się to uda. ZTCW noexcept jest defaultowo dodawane do konstr. kopiujących i operatorów przypisania jeśli wewnątrz wołąją tylko takie fkcje.alagnerC
jest jawnienoexcept
. Jeżeli chcesz sprawdzić czy złożony obiekt spełniais_nothrow_copy_constructible
: https://godbolt.org/z/TeKG4Yf5balagnernoexcept(false)
pozwala legalnie zrobić w klasie zawierającej go(const T&) noxcept(true) = default
(bo defaultowo on by jednaknoexcept
nie był. Tzn. na pewno się to kompiluje, pytanie czy nie trafiam tu w UB.