Почему is_swappable и is_nothrow_swappable не включены в С++ 11?

Я с удивлением обнаружил, что is_swappable<T> и is_nothrow_swappable<T> не относятся к новым метафайлам типа С++ 11 type_traits. Они очень полезны для распространения noexcept для шаблонов и для определения того, можно ли реализовать шаблон без бросания для шаблона.

libС++ сворачивает свои собственные внутренние версии: см. __is_swappable и __is_nothrow_swappable в его версию type_traits, и он широко использует их, но не делает их доступными вне библиотека.

Я закончил тем, что собрал свою собственную версию для личного проекта, который, похоже, работает, но я уверен, что его сломал как-то.

Мне любопытно об отсутствии этих двух, поскольку они кажутся весьма важными. Была ли эта функция рассмотрена во время процесса стандартизации С++ 11, или это был просто недосмотр, что он не был включен? Если бы это было сочтено, что привело к тому, что он не был включен в окончательный стандарт (нехватка времени, проблемы внедрения и т.д.)? Есть ли отчет о дефектах или документ об эволюции, обсуждающий это? Любые планы включить эти черты в С++ 1Y? Есть ли подтвержденная "правильная" версия где-то?

Ответы

Ответ 1

is_swappable<T> и is_nothrow_swappable<T> никогда не были предложены для С++ 11. Это основная причина, по которой они не находятся на С++ 11. То есть ничего не происходит, если не предлагается.

Так почему же они не предлагались?

Говоря из личного опыта, я не предлагаю ничего, что я не реализовал и нашел полезным. И хотя я реализовал их для libС++, я не делал этого до публикации С++ 11. У меня просто не было времени и инструментов для С++ 11. Мое лучшее предположение - это то, что это относится к любому другому.

Рад, что вы нашли их полезными. Вы могли бы предложить их для следующего стандарта С++! Шутки в сторону! Нам нужна ваша помощь!

Обновление

В ответ на:

это немного взломать, потому что это работает, только если swap реализуется с точки зрения конструкторов перемещения и операторов присваивания

Здесь показан тест, показывающий, как он работает при реализации libС++:

#include <type_traits>
#include <iostream>

struct A
{
    A(const A&);
};

struct B
{
};

void swap(B&, B&);

struct C
{
};

void swap(C&, C&) noexcept;

struct D
{
    D(const D&) noexcept;
    D& operator=(const D&) noexcept;
};

int main()
{
    std::cout << "std::__is_nothrow_swappable<int>::value = "
              << std::__is_nothrow_swappable<int>::value << '\n';
    std::cout << "std::__is_nothrow_swappable<A>::value = "
              << std::__is_nothrow_swappable<A>::value << '\n';
    std::cout << "std::__is_nothrow_swappable<B>::value = "
              << std::__is_nothrow_swappable<B>::value << '\n';
    std::cout << "std::__is_nothrow_swappable<C>::value = "
              << std::__is_nothrow_swappable<C>::value << '\n';
    std::cout << "std::__is_nothrow_swappable<D>::value = "
              << std::__is_nothrow_swappable<D>::value << '\n';
}

Какие для меня выходы:

std::__is_nothrow_swappable<int>::value = 1
std::__is_nothrow_swappable<A>::value = 0
std::__is_nothrow_swappable<B>::value = 0
std::__is_nothrow_swappable<C>::value = 1
std::__is_nothrow_swappable<D>::value = 1