C++ 从幻数到int或long的重载分辨率(范围-v3)

C++ 从幻数到int或long的重载分辨率(范围-v3),c++,c++11,c++14,range-v3,C++,C++11,C++14,Range V3,在range-v3中,view\u facade类具有begin()函数 template<typename D = Derived, CONCEPT_REQUIRES_(Same<D, Derived>())> detail::facade_iterator_t<D> begin() { return {range_access::begin_cursor(derived(), 42)}; } 在我的VS中,看起来第二个函数总是被调用 我想知道什么

在range-v3中,
view\u facade
类具有
begin()
函数

template<typename D = Derived, CONCEPT_REQUIRES_(Same<D, Derived>())>
detail::facade_iterator_t<D> begin()
{
    return {range_access::begin_cursor(derived(), 42)};
}
在我的VS中,看起来第二个函数总是被调用


我想知道什么时候魔法数字(42)被转换成
long
来调用第一个函数。

给编译器一个合适的文本

template<typename D = Derived, CONCEPT_REQUIRES_(Same<D, Derived>())>
detail::facade_iterator_t<D> begin()
{
    return {range_access::begin_cursor(derived(), 42)};
}
return {range_access::begin_cursor(derived(), 42l)};
RANGES_DECLTYPE_AUTO_RETURN
(
  static_cast<Rng const &>(rng).begin_cursor()
)

(它是“四十二el”,而不是数字421:)

鉴于
范围(u DECLTYPE)自动(u AUTO)返回

然后,您的两个重载(在宏展开后)变为:

模板
静态自动开始\u光标(Rng和Rng,长)/--1
->decltype(rng.begin\u cursor())
{
返回rng.begin\u游标()
}
模板
静态自动开始\u光标(Rng&Rng,int)/--2
->decltype(静态\u转换(rng).begin\u cursor())
{
返回静态_cast(rng)。开始_游标();
}

当使用
int
参数调用
begin\u cursor
时,重载解析会找到第二个重载的精确匹配项。最好是
long
,因为这需要参数表达式的转换。但是,如果
static\u cast(rng).begin\u cursor()
无效,即当成员函数
begin\u cursor()
未限定常量时,
decltype
说明符内的表达式将触发替换失败,因此编译器将继续搜索另一个重载,返回到第一个功能。

范围\取消类型\自动\返回
template<typename D = Derived, CONCEPT_REQUIRES_(Same<D, Derived>())>
detail::facade_iterator_t<D> begin()
{
    return {range_access::begin_cursor(derived(), 42)};
}
RANGES_DECLTYPE_AUTO_RETURN
(
  static_cast<Rng const &>(rng).begin_cursor()
)
( 静态_cast(rng).开始_游标() )
扩展到类似

-> decltype(static_cast<Rng const &>(rng).begin_cursor())
   { return static_cast<Rng const &>(rng).begin_cursor(); }
->decltype(静态\u cast(rng).begin\u cursor())
{return static_cast(rng).begin_cursor();}
两个
begin\u光标
具有不同的
->decltype
返回值,这将为您提供SFINAE。这两种重载都被考虑。如果
const
版本由于
decltype
表达式在直接上下文中格式错误而出现SFINAE故障,则会将其删除,并选择
long
版本


如果没有,则
42
更愿意转换为
int
,而不是
long
。所以选择了
const
版本。

range-v3是什么?它与C++标准的关系是什么?<代码> RangeSeDelyType AutoRead < /Cord>是一个宏,它把它的参数放在一个DeCype说明符中作为一个返回类型,因此它充当表达式sFANE,并且超载占用<代码>长< /COD>作为第二选择回退@πyWang-To-α。ῥεῖ 很抱歉我行事鲁莽。range-v3(Ranges)是c++1y特性的一个建议。你可以找到来源