这是来自: 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++ 代码。
任何解释表示赞赏。谢谢。
是的,我知道,我应该有一个复制品,但复制品制作起来很烦人。在我制作一个(可能会给 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)