为什么is_copy_assignable的实现不起作用?

时间:2018-09-20 23:34:21

标签: c++ templates template-meta-programming sfinae copy-assignment

这是我为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&(就像副本分配操作符一样)。好吧,那为什么呢?

1 个答案:

答案 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&>()