Poniższy kod jest kompilowany bez żadnych błędów/ostrzeżeń za pomocą gcc 6.3 (https://godbolt.org/g/sVZ8OH), ale zawiera niebezpieczne niezdefiniowane zachowanie z powodu nieprawidłowego dostępu do pamięci zaznaczonego poniżej. Główną przyczyną jest niejawna konwersja wykonana w emplace_back. Czy ktokolwiek może zaproponować dobry sposób lub najlepsze praktyki, aby uniknąć takich błędów w kodzie?Niebezpieczna niejawna konwersja w emule
#include <iostream>
#include <vector>
struct Foo
{
explicit Foo(const int& i) : i{i} {}
void foo() const { std::cout << i; } // invalid memory access, as i is an invalid ref!!
const int& i;
};
void bar(const double& d) {
std::vector<Foo> fv;
fv.emplace_back(d);
}
„Czy ktoś może sugerować dobry sposób lub najlepsze praktyki aby uniknąć takich błędów w kodzie? " - unikać używania referencji jako członków? –
Foo {d} zostanie odrzucone przez kompilator, ponieważ inicjalizacja {} zapobiega niejawnym konwersjom. – user2736667
@ user2736667 oops, thankyou, comment deleted – Oktalist