0

这是我对 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&(就像复制赋值运算符一样)。那么,为什么?

4

1 回答 1

1

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
{};
于 2018-09-21T00:10:11.297 回答