Правильная реализация is_std_swappable - PullRequest
0 голосов
/ 19 февраля 2019

Это не является дубликатом Как правильно реализовать is_swappable для тестирования концепции Swappable? , особенно в отношении аспекта "тестирования для Swappable concept".

Я пытался реализовать черту is_std_swappable:

#include <type_traits>
#include <utility>

template< typename T, typename = void >
struct is_std_swappable : std::false_type {};

template< typename T >
struct is_std_swappable< T, decltype( std::swap( std::declval< T& >(), std::declval< T& >() ) ) > : std::true_type {};

Это работает для std::string и static_assert( is_std_swappable< std::string >::value, "" ); не приводит к ошибке.

Теперь я попробовалтип, который не должен заменяться std::swap при условии реализации, использующей std::move:

struct DontMove {
    DontMove() = default;
    DontMove( DontMove&& ) = delete;
};

static_assert( is_std_swappable< DontMove >::value, "" );

Result (см. https://godbolt.org/z/014kJ2):

  • Clang 7.0.0видит здесь ошибку («static_assert не удалось из-за требования is_std_swappable<DontMove>::value»).

  • MSVC 19.16 не выдает ошибку. Это может произойти, если MSVC предоставляет постоянную реализацию std::swapС другой стороны, использование свопа приводит к ошибке («попытка сослаться на удаленную функцию»):

    void foo() {
        DontMove dm;
        std::swap( dm, dm );
    }
    

Кто здесь? Или моя попытка на is_std_swappable неисправен?

1 Ответ

0 голосов
/ 19 февраля 2019

Стандарт не требует, чтобы std::swap был дружественным к SFINAE.Это тоже не мешает.

Ни один из компиляторов не прав.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...