我试图使用以下代码来测试使用操作符->*
指向类的指针上的成员函数是否正常
// test.cc
#include <type_traits>
template <class T> auto declval() noexcept -> std::add_rvalue_reference_t<T>;
template <class T, class P, class ...Args> constexpr const static inline bool __is_nothrow_pointer_to_function_member_accessable_v = noexcept( (declval<T>()->*declval<P>())(declval<Args>()...) );
struct A {
int i;
int F() { return 0; }
int F(int) noexcept { return 0; }
int F(bool) & noexcept { return 0; }
int F(bool) && { return 1; }
};
int main() {
static_assert(__is_nothrow_pointer_to_function_member_accessable_v<A*, int (A::*)(int), int>);
static_assert(__is_nothrow_pointer_to_function_member_accessable_v<A*, int (A::*)(bool) &, bool>);
}
我使用命令clang++-5.0 -std=c++17 test.cc
对其进行了编译,并且2个静态断言均失败。