std::type_info 上的指针是否可以比较常量表达式中的相等性?
Can pointers on std::type_info be compared for equality in constant expressions?
可以在任何 class T
的 std::type_info
对象上定义 constexpr
指针。该语言是否允许在编译时比较此类指针的相等性?
例如:
#include <typeinfo>
template <typename T>
inline constexpr auto * pType = &typeid(T);
int main() {
static_assert( pType<int> == pType<int> );
static_assert( pType<int> != pType<char> );
}
问题来了,因为 Clang 接受了,但是 GCC returns 错误:
error: non-constant condition for static assertion
8 | static_assert( pType<int> != pType<char> );
| ~~~~~~~~~~~^~~~~~~~~~~~~~
<source>:8:31: error: '(((const std::type_info*)(& _ZTIi)) != ((const std::type_info*)(& _ZTIc)))' is not a constant expression
这是一个 GCC 错误:85428
顺便说一句,pType<int> == pType<int>
is not always guaranteed。
可以在任何 class T
的 std::type_info
对象上定义 constexpr
指针。该语言是否允许在编译时比较此类指针的相等性?
例如:
#include <typeinfo>
template <typename T>
inline constexpr auto * pType = &typeid(T);
int main() {
static_assert( pType<int> == pType<int> );
static_assert( pType<int> != pType<char> );
}
问题来了,因为 Clang 接受了,但是 GCC returns 错误:
error: non-constant condition for static assertion
8 | static_assert( pType<int> != pType<char> );
| ~~~~~~~~~~~^~~~~~~~~~~~~~
<source>:8:31: error: '(((const std::type_info*)(& _ZTIi)) != ((const std::type_info*)(& _ZTIc)))' is not a constant expression
这是一个 GCC 错误:85428
顺便说一句,pType<int> == pType<int>
is not always guaranteed。