Ответ 1
Обоснование изменения библиотеки находится в LWG 2510 "Типы тегов не должны быть DefaultConstructible
" :
std::experimental::optional
, по определенным причинам, указывает свой типnullopt
, чтобы он не былDefaultConstructible
. Он не делает этого для своего типа тегаin_place_t
, и ни один из стандартных не подходит для любого из его типов тегов. Это оказывается очень неудачным, рассмотрим следующее:#include <memory> #include <array> void f(std::array<int, 1>, int) {} // #1 void f(std::allocator_arg_t, int) {} // #2 int main() { f({}, 666); // #3 }
Вызов в # 3 неоднозначен. Еще хуже то, что если перегрузка № 1 удалена, вызов работает просто отлично. Весь смысл типа тега заключается в том, что он либо должен упоминаться в вызове, либо должен быть переадресованным аргументом, поэтому возможность создания типа тега вроде этого не имеет смысла.
Проблема LWG развивалась бок о бок с CWG 1518 "Явные конструкторы по умолчанию и инициализация списка копий" , которая имеет полезный фон.