为什么下面提供的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)>);
型
为什麽?
1条答案
按热度按时间whhtz7ly1#
decltype(a_getter)
不仅是不可赋值的,因为a_getter
是constexpr
,因此是const
。如果你想从
a_getter
中推断出没有const限定符的类型,你可以使用std::remove_const_t
或std::decay_t
(https://godbolt.org/z/7qvhaqxeW)。