本文介绍了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>); }Run on gcc.gotbolt
如果我在这里使用<而不是std::less,代码将无法编译。这并不奇怪,因为如果指针指向不相关的对象,则关系指针比较的结果是unspecified,显然这样的比较不能在编译时完成。 <source>:9:20: error: constexpr variable 'a' must be initialized by a constant expression constexpr bool a = foo<int> < foo<float>; ^ ~~~~~~~~~~~~~~~~~~~~~ <source>:9:33: note: comparison has unspecified value constexpr bool a = foo<int> < foo<float>; ^即使我使用std::less,代码仍然无法编译。编译器错误是相同的。std::less似乎至少在libstdc++和libc++中实现为<;我在GCC、Clang和MSVC上得到了相同的结果。
但是,关于std::less的cp首选项页面声称:
其operator()为constexpr。
它神奇地实现了指针的严格总顺序,即可以用来比较不相关的指针和合理的结果。
那么,是所有这些编译器中的错误,还是我遗漏了使上面的代码格式错误的std::less的某些细节?
推荐答案我认为您提出的问题没有明确的答案。这是LWG 2833的一个具体情况:标记库函数constexpr不会解释调用该函数将产生常量表达式的情况。
在解决此问题之前,我认为您根本不能依赖std::less能够在编译时比较不相关的指针。
更多推荐
Std::Less是否应该允许在编译时比较不相关的指针?
发布评论