Is std::less supposed to allow comparison of unrelated pointers at compile-time?(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.org
如果我在这里使用<
而不是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是否应该允许在编译时比较不相关的指针?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Std::Less是否应该允许在编译时比较不相关的指针?


基础教程推荐
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
- 我有静态或动态 boost 库吗? 2021-01-01
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 常量变量在标题中不起作用 2021-01-01
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 这个宏可以转换成函数吗? 2022-01-01
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01