const std::string& id() const { return id_; }
std::string id() { return id_; }
В нем есть одна досадная опечатка, из которой код:
order.id() = 123;
делал то, что от него не ожидалось, а точнее, ничего не делал. И проблема, как вы наверное уже догадались, в пропущеном значке "&" во второй строке. Должно было быть так:
const std::string& id() const { return id_; }
std::string& id() { return id_; }
Эта опечатка стоила мне часа поиска проблемы через вторичные признаки в виде иногда не обновляемой базы данных.
Причина? А все потому, что я поленился написать тесты изначально, решив, что это уж очень простые методы. Но теперь таки добавил для этого тест:
TEST(Order, GetterSetters) {
Order order;
...
EXPECT_EQ(0, order.id()); // Must be initialized.
order.id() = 123;
EXPECT_EQ(123, order.id());
...
}
Решил сэкономить время, а вышло наоборот.
Вывод: тесты, тесты и тесты.