C++这个类型应该满足std::is_copy_assignable吗?

C++ Should this type satisfy std::is_copy_assignable?

使用以下代码:

namespace _Detail
{
    struct _HasCopyAssignment
    {
        template <typename _Type>
        static auto test(_Type&& var) -> decltype(var = var, std::true_type());
        static auto test(...) -> decltype(std::false_type());
    };
}

template <typename _Type>
struct HasCopyAssignment : public decltype(_Detail::_HasCopyAssignment::test(std::declval<_Type>()))
{};

此测试类型:

struct B
{
    B& operator=(B&);
};

我的 HasCopyAssignment<B>::value 计算结果为 true,但是 <type_traits> 在 GCC 标准库实现中对 is_copy_assignable<B>::value 的测试是 false。如果对象的复制赋值运算符将非常量引用作为参数,它是否应该被视为可复制赋值?

libstdc++ 将其标记为非 std::is_copy_assignable 是正确的。根据 C++14 20.10.4.3 table 49,is_copy_assignable 定义为:

For a referenceable type T, the same result as is_assignable<T, const T&>::value, otherwise false.

这意味着类型特征 std::is_copy_assignable<T> 意味着“T 可以用 const T& 参数赋值。”你的 class 做不到。