本文介绍了Std::Less是否应该允许在编译时比较不相关的指针?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
考虑以下代码:
#include <functional>
#include <typeinfo>
template <typename T>
inline constexpr const void *foo = &typeid(T);
int main()
{
constexpr bool a = std::less<const void*>{}(foo<int>, foo<float>);
}
如果我在这里使用<
而不是std::less
,代码将无法编译。这并不奇怪,因为如果指针指向不相关的对象,则关系指针比较的结果是unspecified,显然这样的比较不能在编译时完成。即使我使用std::less
,代码仍然无法编译。编译器错误是相同的。std::less
似乎至少在libstdc++和libc++中实现为<
;我在GCC、Clang和MSVC上得到了相同的结果。
但是,关于std::less
的cp首选项页面声称:
其
operator()
为constexpr
。它神奇地实现了指针的严格总顺序,即可以用来比较不相关的指针和合理的结果。
那么,是所有这些编译器中的错误,还是我遗漏了使上面的代码格式错误的std::less
的某些细节?
推荐答案
我认为您提出的问题没有明确的答案。这是LWG 2833的一个具体情况:标记库函数constexpr
不会解释调用该函数将产生常量表达式的情况。
在解决此问题之前,我认为您根本不能依赖std::less
能够在编译时比较不相关的指针。
这篇关于Std::Less是否应该允许在编译时比较不相关的指针?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!