static_assert(std::is_same_v<decltype(Test::f), decltype(&Test::f)>); 为什么断言失败
时间: 2024-01-20 08:02:10 浏览: 146
STM32F103单片机连接EC800-4G模块采集GNSS定位数据和多组传感器数据上传到ONENET云平台并接收控制指令.zip
`static_assert(std::is_same_v<decltype(Test::f), decltype(&Test::f)>);` 这条语句本意是判断类 `Test` 中的静态成员函数 `f` 的类型是否为指向该静态成员函数的指针类型,如果是则断言通过,否则断言失败。
但是该语句会造成编译错误,因为在使用成员函数指针时,需要使用成员函数的地址来初始化成员函数指针,而静态成员函数没有实例对象,因此不能通过实例对象来获取其地址。相反,可以直接使用类名来获取静态成员函数的地址,因此静态成员函数的类型与指向静态成员函数的指针类型是等价的,可以直接使用 `decltype(&Test::f)` 来表示。
因此,正确的断言语句应该是 `static_assert(std::is_same_v<decltype(Test::f), void(*)()>);`,其中 `void(*)()` 表示指向无参无返回值函数的指针类型。
阅读全文