gpt4 book ai didi

c++ - std::less 是否应该允许在编译时比较不相关的指针?

转载 作者:行者123 更新时间:2023-12-01 08:31:57 28 4
gpt4 key购买 nike

考虑这个代码:

#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 上得到了相同的结果。
但是,cppreference 页面关于 std::less 声称:
  • 它的 operator()constexpr .
  • 它神奇地在指针上实现了严格的全序,即可用于将不相关的指针与合理的结果进行比较。

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

    最佳答案

    我认为您提出的问题没有明确的答案。这是LWG 2833的一个具体案例: 标记库函数 constexpr不解释在什么情况下调用函数会产生一个常量表达式。
    在这个问题解决之前,我认为你根本不能依赖std::less能够在编译时比较不相关的指针。

    关于c++ - std::less 是否应该允许在编译时比较不相关的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62492020/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com