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

Is std::less supposed to allow comparison of unrelated pointers at compile-time?(Std::Less是否应该允许在编译时比较不相关的指针?)
本文介绍了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首选项页面声称:

  1. operator()constexpr

  2. 它神奇地实现了指针的严格总顺序,即可以用来比较不相关的指针和合理的结果。

那么,是所有这些编译器中的错误,还是我遗漏了使上面的代码格式错误的std::less的某些细节?

推荐答案

我认为您提出的问题没有明确的答案。这是LWG 2833的一个具体情况:标记库函数constexpr不会解释调用该函数将产生常量表达式的情况。

在解决此问题之前,我认为您根本不能依赖std::less能够在编译时比较不相关的指针。

这篇关于Std::Less是否应该允许在编译时比较不相关的指针?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

socks4 with asynchronous boost::asio(带有异步Boost::ASIO的socks4)
Boost ASIO HTTP client POST(增强ASIO HTTP客户端开机自检)
asio::strandlt;asio::io_context::executor_typegt; vs io_context::strand(Asio::strandlt;asio::io_context::executor_typegt;VS io_CONTEXT::Strand)
What#39;s the difference between asio::io_context and asio::thread_pool?(ASIO::IO_CONTEXT和ASIO::THREAD_POOL有什么区别?)
How to use boost::asio with Linux GPIOs(如何在Linux GPIO中使用Boost::ASIO)
Boost asio io_service vs io_context(增强ASIO io_服务与io_Context)