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 做不到。
使用以下代码:
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 asis_assignable<T, const T&>::value
, otherwisefalse
.
这意味着类型特征 std::is_copy_assignable<T>
意味着“T
可以用 const T&
参数赋值。”你的 class 做不到。