Std::Less是否应该允许在编译时比较不相关的指针?

编程入门 行业动态 更新时间:2024-10-25 06:32:12
本文介绍了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是否应该允许在编译时比较不相关的指针?

    本文发布于:2023-07-30 14:12:41,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1250168.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:指针   不相关   Std

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!