gpt4 book ai didi

c++ - std::max 在统一初始化和 constexpr int 下表现出乎意料

转载 作者:行者123 更新时间:2023-12-01 13:38:01 55 4
gpt4 key购买 nike

我正在试验 std::max。我想通过统一初始化(花括号)传递整数 constexpr,以将它们与浮点变量进行比较。

实验 a):用 double/int 混合调用 std::max()

    double a = 3.0;
int b = 5;
auto res = std::max(a, b);

不编译。 Clang 报告 error: no matching function for call to 'max' .这当然没问题。

实验 b):使用花括号 + constexpr int 进行非箭头转换
    double a = 3.0;
constexpr int b = 5;
auto res = std::max(a, {b});

编译并按预期工作:返回值为 5.0 的 double 值。

实验 c):与 b) 相同,但交换 std::max 的参数。
    double a = 3.0;
constexpr int b = 5;
auto res = std::max({b}, a);

不能在 gcc 和 clang 下编译。为什么?

Clang 报告 error: called object type 'double' is not a function or function pointer .

最佳答案

存在 std::max 过载看起来像这样(来自 cppreference.com ):

template< class T, class Compare >
constexpr T max( std::initializer_list<T> ilist, Compare comp );

这更适合您的电话 auto res = std::max({b}, a);
template< class T >
constexpr const T& max( const T& a, const T& b );

您正在尝试调用它,因为 {b}可以推导出 std::initializer_list<int>并且该调用在两个参数中都具有完全匹配的转换等级,而您要调用的重载需要从 int 进行转换。至 double这不是完全匹配。

然后将第二个参数视为 Compare为比较操作调用仿函数,但调用 double显然失败了。如果第二个参数不可调用,则不会禁用重载,这就是仍然选择它的原因。
auto res = std::max(a, {b}); 不会发生这种情况,因为 std::initializer_list 没有过载第二个参数的参数,因此只有您要调用的重载是可行的。初始值设定项列表使第二个参数成为非推导的上下文,这就是它与 auto res = std::max(a, b); 形成对比的原因。 ,由于两个参数之间的模板参数推导不匹配而失败。

关于c++ - std::max 在统一初始化和 constexpr int 下表现出乎意料,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61173719/

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