提问人:Alexey Starinsky 提问时间:11/17/2023 最后编辑:463035818_is_not_an_aiAlexey Starinsky 更新时间:11/17/2023 访问量:83
为什么类不可分配?
Why is a class not assignable?
问:
为什么下面提供的类是不可分配的?func_getter
#include <type_traits>
#include <string>
template <class T, class ReturnType>
using FuncPtr = ReturnType(T::*)() const;
template <class T, class ReturnType>
class func_getter
{
public:
using MyFuncPtr = FuncPtr<T, ReturnType>;
constexpr func_getter(MyFuncPtr p) : m_p(p) {}
func_getter(const func_getter&) = default;
func_getter(func_getter&&) = default;
func_getter& operator = (const func_getter&) = default;
func_getter& operator = (func_getter&&) = default;
constexpr ReturnType operator() (const T& val) const
{
return (val.*m_p)();
}
private:
MyFuncPtr m_p;
};
struct X
{
int a;
std::string b;
int GetA() const
{
return a;
}
int GetA1() const
{
return a;
}
};
using GetAPtr = FuncPtr<X, int>;
static_assert(std::is_copy_constructible_v<GetAPtr>);
static_assert(std::is_copy_assignable_v<GetAPtr>);
static_assert(std::is_move_constructible_v<GetAPtr>);
static_assert(std::is_move_assignable_v<GetAPtr>);
inline constexpr auto a_getter = func_getter(&X::GetA);
static_assert(std::is_copy_constructible_v<decltype(a_getter)>);
static_assert(std::is_move_constructible_v<decltype(a_getter)>);
以上所有操作都不会失败,但以下操作会失败(至少MSVC2022失败):static_asserts
static_assert(std::is_copy_assignable_v<decltype(a_getter)>);
static_assert(std::is_move_assignable_v<decltype(a_getter)>);
为什么?
答:
5赞
463035818_is_not_an_ai
11/17/2023
#1
decltype(a_getter)
不仅不可分配,因为 是 ,因此 。a_getter
constexpr
const
如果要推断不带 const 限定符的类型,可以使用 or (https://godbolt.org/z/7qvhaqxeW)。a_getter
std::remove_const_t
std::decay_t
评论
0赞
463035818_is_not_an_ai
11/17/2023
@JaMiT哦,对了,我混淆了类型。现在没有时间改进它,我试图让它至少少犯错
评论
a_getter
constexpr
constexpr int x = 42; x= 0;
同样的事情a_getter
具有限定符,您需要使用它来获取核心类型const
std::remove_const_t<decltype(a_getter)>
std::decay_t