【发布时间】:2019-02-19 17:03:42
【问题描述】:
这不是What is a proper way to implement is_swappable to test for the 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, "" );
结果(见https://godbolt.org/z/014kJ2):
Clang 7.0.0 在这里看到一个错误(“static_assert failed due to requirements
is_std_swappable<DontMove>::value")。-
MSVC 19.16 不会出错。如果 MSVC 提供了
std::swap的不动实现。另一方面,使用 交换产生错误(“试图引用已删除的函数”):void foo() { DontMove dm; std::swap( dm, dm ); }
谁在这里?还是我对is_std_swappable 的尝试有问题?
【问题讨论】:
-
失败的原因在 this answer 中解释。我把它当作一个骗子,因为它也提供了解决方法
-
不清楚这是否“失败”。编译器在这里的行为不同。我试图在godbolt.org/z/NQajmI 中重现其他解决方案。结果相同。所以这可能不是the other question的重复。
-
啊,我明白了。我想要“实例失败不是错误”而不是 SFINAE。
标签: c++ c++11 visual-c++