为什么类不可分配?

Why is a class not assignable?

提问人:Alexey Starinsky 提问时间:11/17/2023 最后编辑:463035818_is_not_an_aiAlexey Starinsky 更新时间:11/17/2023 访问量:83

问:

为什么下面提供的类是不可分配的?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)>);

为什么?

C++语言

评论

5赞 463035818_is_not_an_ai 11/17/2023
为什么要删除包含?每个想要使用编译器查看代码的人都必须将它们添加回来
2赞 463035818_is_not_an_ai 11/17/2023
您不能将其分配给何时a_getterconstexpr
2赞 463035818_is_not_an_ai 11/17/2023
constexpr int x = 42; x= 0;同样的事情
3赞 user7860670 11/17/2023
a_getter具有限定符,您需要使用它来获取核心类型conststd::remove_const_t<decltype(a_getter)>
2赞 463035818_is_not_an_ai 11/17/2023
或取决于你想要什么std::decay_t

答:

5赞 463035818_is_not_an_ai 11/17/2023 #1

decltype(a_getter)不仅不可分配,因为 是 ,因此 。a_getterconstexprconst

如果要推断不带 const 限定符的类型,可以使用 or (https://godbolt.org/z/7qvhaqxeW)。a_getterstd::remove_const_tstd::decay_t

评论

0赞 463035818_is_not_an_ai 11/17/2023
@JaMiT哦,对了,我混淆了类型。现在没有时间改进它,我试图让它至少少犯错