На самом деле это отличный вопрос.
Причины могут отличаться от сценария к сценарию, но связаны с такими проблемами, как:
- Насколько читаем конструктор?
- Я создаю искусственные объекты или излишне дублирую условные выражения для записи конструктора в терминах списка инициализаторов?
- Может ли мой конструктор иметь неоднозначность с конструктором, предназначенным для выполнения конструирования другого типа?
- Очевидно ли, что мой конструктор делает без необходимости прописывать имя в коде?
Все вышеперечисленное будет включать некоторую степень субъективности.
гипотетический пример, догадываясь о внутренностях QVersionNumber,
Как бы вы записали это в терминах в списке инициализации?
QVersionNumber
QVersionNumber::fromString(const QString &string, int *suffixIndex)
{
std::optional<QVersionNumber> result;
auto first = string.begin();
auto last = string.end();
auto opt_major = maybe_extract_decimal(first, last); // modifies first
if (not opt_major.has_value())
result.emplace();
else
{
auto opt_minor = maybe_extract_decimal(first, last); // modifies first
if (not opt_major.has_value())
result.emplace(*opt_major);
else
result.emplace(*opt_minor);
}
if (suffixIndex)
*suffixIndex = int(std::difference(string.begin(), first);
return *std::move(result);
}
Это, конечно, возможно, если обратиться к частному конструктору, который принимает специализированную функциюобъект.Но автор библиотеки, возможно, решил, что это слишком загадочно или трудно поддерживать.