小编Dav*_*ien的帖子

declval<_Xp(&)()>()() - 这在下面的上下文中意味着什么?

这是来自: https: //github.com/gcc-mirror/gcc/blob/master/libstdc++-v3/include/std/type_traits

  template<typename _Xp, typename _Yp>
    using __cond_res
      = decltype(false ? declval<_Xp(&)()>()() : declval<_Yp(&)()>()());
...
  template<typename _Tp1, typename _Tp2>
    struct __common_reference_impl<_Tp1, _Tp2, 3,
                   void_t<__cond_res<_Tp1, _Tp2>>>
    { using type = __cond_res<_Tp1, _Tp2>; };
Run Code Online (Sandbox Code Playgroud)

我想弄清楚什么_Xp(&)()是 - 它是函数调用签名吗?即构造函数?确实没有意义。那里似乎有一个匿名变量名,即:

_Xp(&anon)()
Run Code Online (Sandbox Code Playgroud)

我仍然无法理解它,而且过去 34 年我一直在编写 C++ 代码。

任何解释表示赞赏。谢谢。

c++ type-traits c++20

25
推荐指数
3
解决办法
1390
查看次数

应该 set::equal_range() 返回 pair( set::lower_bound(), set::upper_bound() )

是的,我知道,我应该有一个复制品,但复制品制作起来很烦人。在我制作一个(可能会给 clang 一个错误)之前,我想确保我对事情应该如何工作的理解是正确的。

  • MSVC:返回set::equal_range(){lower_bound(),upper_bound()}

  • Clang:返回set::equal_range(){lower_bound(),upper_bound()-1}。(使用 stdlib=libc++)——当然还有我的例子。

我对 STL 编程过去 20 年的期望是 MSVC 是正确的。事实上,我正在编辑的代码是我 20 年前写的,它曾经在 clang 和 gcc 中工作,但现在只能在 MSVC 中工作(也许 gcc - 我还没有尝试过 - 我正在使用一些标题C++20 并且仅在 stdlib=libc++ 和 MSVC 中,但不在 gcc 中)。

无论如何,我对set::equal_range()应该返回什么的假设是否正确?

好吧,检查一下:

带有 -stdlib=libc++ 的 Clang:https ://godbolt.org/z/xfnasKa73

没有 -stdlib=libc++ 的 Clang:https ://godbolt.org/z/5qYEj4MEd

如果您认为我的比较器是假的,请告诉我。

下面是测试代码:

#include <iostream>
#include <utility>
#include <set>

using namespace std;

struct Range : public pair< size_t, size_t >
{
    using …
Run Code Online (Sandbox Code Playgroud)

c++ c++-standard-library language-lawyer

1
推荐指数
1
解决办法
92
查看次数