c++ 为什么一个类是不可赋值的?

x6yk4ghg  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(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)>);

字符串
以上所有static_asserts都不会失败,但以下失败(至少对于MSVC 2022):

static_assert(std::is_copy_assignable_v<decltype(a_getter)>);
static_assert(std::is_move_assignable_v<decltype(a_getter)>);


为什麽?

whhtz7ly

whhtz7ly1#

decltype(a_getter)不仅是不可赋值的,因为a_getterconstexpr,因此是const
如果你想从a_getter中推断出没有const限定符的类型,你可以使用std::remove_const_tstd::decay_thttps://godbolt.org/z/7qvhaqxeW)。

相关问题