Существует состояние, в котором объект может быть действительным, но неопределенным:
действительное, но неуказанное состояние [§ 17.3]
состояние объекта, которое не указано, за исключением того, что инварианты объекта выполняются, и операции над объектом ведут себя так, как указано для его типа
[ Пример: Если объект x типа std :: vector находится в действительном, но неуказанном состоянии , x.empty () можно назвать безоговорочно, а x.front () можно вызвать только в том случае, если x.empty () возвращает false. -end example ]
blockquote>При чтении стандарта C ++ состояние
data()
не указывается, когда вектор пуст. Итак, состояние действительное, но неуказанное состояние . Поэтому возвращаемое значениеdata()
, когда вектор пуст, может быть любым (нулевое или случайное значение). Это зависит от реализации компилятора.В этом случае, следуя примеру в § 17.3, вы должны вызвать
empty()
перед использованиемdata()
, чтобы убедиться, что возвращаемое значение является вашим ожиданием.if (!v.empty()) do_something(v.data())