重载函数的特征

Traits of overloaded functions

我正在尝试使用 const/non const 重载获取 return 类型的函数。

struct TestClass {
    const int* getPtr() const { return ptr; }
    int* getPtr() { return ptr; }
private:
    int* ptr;
};

using return_ptr_type = typename std::invoke_result<decltype(&TestClass::getPtr), TestClass>::type;
static_assert(std::is_same<return_ptr_type, int*>::value);

编译器抱怨无法解析重载函数的地址。我明白为什么会这样,但不知道如何解决。

注意:我看到关于如何解决重载之间堆栈溢出的其他问题,但它们处理具有不同函数参数的重载,而不是 const 重载。

decltype(&TestClass::getPtr)中不会发生重载解析;编译器甚至没有上下文可以选择。

您可以通过调用getPtr() const 或非const 对象来获取return 类型,使重载决议生效。例如

using return_ptr_type1 = decltype(std::declval<TestClass>().getPtr());
static_assert(std::is_same<return_ptr_type1, int*>::value);

using return_ptr_type2 = decltype(std::declval<const TestClass>().getPtr());
static_assert(std::is_same<return_ptr_type2, const int*>::value);