为什么 is_copy_assignable 的实现不起作用?
Why Implementation for is_copy_assignable doesn't work?
这是我对 is_copy_assignable 的实现尝试:
template<typename, typename = void>
struct IsCopyAssignable : std::false_type
{};
template<typename T>
struct IsCopyAssignable<T, decltype(std::add_lvalue_reference<T>::type = std::add_lvalue_reference<const T>::type, void())> : std::true_type
{};
失败了。
这是测试用例:
int main()
{
struct Structure {};
std::cout << "IsCopyAssignable=\n";
std::cout << IsCopyAssignable<int>::value << '\n'; // should be true
std::cout << IsCopyAssignable<int&>::value << '\n'; // should be true
std::cout << IsCopyAssignable<const int&>::value << '\n'; // should be false
std::cout << IsCopyAssignable<const double&>::value << '\n'; // should be false
std::cout << IsCopyAssignable<class Structure>::value << '\n'; // should be true
std::cout << '\n';
}
他们都打印错误。
(然后我意识到 declval 与方便的 void_t 结合 - 当然还有 decltype - 可以用于类似的事情。)但我仍然不明白为什么这个不工作。我想我们要测试是否可以将 const T&
赋值给 T&
(就像复制赋值运算符那样)。那么,为什么?
你的 decltype(std::add_lvalue_reference<T>::type = std::add_lvalue_reference<const T>::type, void())
对于每个 T
都是错误的,因为 std::add_lvalue_reference<T>::type
实际上不是一个值,而是一个类型。
std::declval
可能有帮助:
您想改为检查表达式 std::declval<T&>() = std::declval<const T&>()
是否有效。
所以
template<typename T>
struct IsCopyAssignable<T,
decltype(std::declval<T&>() = std::declval<const T&>(), void())>
: std::true_type
{};
这是我对 is_copy_assignable 的实现尝试:
template<typename, typename = void>
struct IsCopyAssignable : std::false_type
{};
template<typename T>
struct IsCopyAssignable<T, decltype(std::add_lvalue_reference<T>::type = std::add_lvalue_reference<const T>::type, void())> : std::true_type
{};
失败了。
这是测试用例:
int main()
{
struct Structure {};
std::cout << "IsCopyAssignable=\n";
std::cout << IsCopyAssignable<int>::value << '\n'; // should be true
std::cout << IsCopyAssignable<int&>::value << '\n'; // should be true
std::cout << IsCopyAssignable<const int&>::value << '\n'; // should be false
std::cout << IsCopyAssignable<const double&>::value << '\n'; // should be false
std::cout << IsCopyAssignable<class Structure>::value << '\n'; // should be true
std::cout << '\n';
}
他们都打印错误。
(然后我意识到 declval 与方便的 void_t 结合 - 当然还有 decltype - 可以用于类似的事情。)但我仍然不明白为什么这个不工作。我想我们要测试是否可以将 const T&
赋值给 T&
(就像复制赋值运算符那样)。那么,为什么?
你的 decltype(std::add_lvalue_reference<T>::type = std::add_lvalue_reference<const T>::type, void())
对于每个 T
都是错误的,因为 std::add_lvalue_reference<T>::type
实际上不是一个值,而是一个类型。
std::declval
可能有帮助:
您想改为检查表达式 std::declval<T&>() = std::declval<const T&>()
是否有效。
所以
template<typename T>
struct IsCopyAssignable<T,
decltype(std::declval<T&>() = std::declval<const T&>(), void())>
: std::true_type
{};