This situation currently does result in the value beeing smoothed while staying identical:
juce::SmoothedValue<double> smoothedValue;
smoothedValue.reset(100);
smoothedValue.setCurrentAndTargetValue(1.0);
smoothedValue.setTargetValue(0.0);
smoothedValue.setTargetValue(1.0);
jassert(!smoothedValue.isSmoothing());
This might look like an unnecessary optimization for a rare case, but in many case you might refresh the target value multiple times, eg with a generic value and then a specific one when some specific condition is met. This might causes the value to be constantly smoothed with the current implementation.
Here is a fix, in setTargetValue (line 289 of juce_SmoothedValue.h for JUCE 8.0.8)
from
if (stepsToTarget <= 0)
to
if (stepsToTarget <= 0 || approximatelyEqual (newValue, this->currentValue))
