这是我为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&
(就像副本分配操作符一样)。好吧,那为什么呢?
答案 0 :(得分:1)
每个decltype(std::add_lvalue_reference<T>::type = std::add_lvalue_reference<const T>::type, void())
的{{1}}格式都不正确,因为T
实际上不是值,而是类型。
std::add_lvalue_reference<T>::type
可能有帮助:
您要检查表达式std::declval
是否有效。
所以
std::declval<T&>() = std::declval<const T&>()