std :: max通过统一初始化和constexpr int表现出意外情况

CN85:

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

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

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

不编译。lang报告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下编译。为什么?

lang报告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>该调用具有两个参数精确匹配的转换级别,而你要拨打的过载需要一个转换从intdouble这是不准确的匹配。

然后,将第二个参数视为Compare要进行比较操作函子,但double显然调用a 失败。如果第二个参数不可调用,则不会禁用重载,这就是为什么仍然选择它。

不会发生这种情况auto res = std::max(a, {b});,因为std::initializer_list第二个参数没有参数的重载,因此只有您要调用的重载才是可行的。初始值设定项列表使第二个参数成为未推导的上下文,这就是为什么它与之相对的原因auto res = std::max(a, b);,由于两个参数之间的模板参数推导不匹配而导致失败。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

依赖于参数的查询在从另一个名称空间别名的类型上表现出意外

与awk一起使用的正则表达式中的量词表现出意外

:before和:after伪元素表现出混乱的行为

For循环和ForEach循环与getJSON表现出不同的行为

JAVA - GridLayout 和 JScrollPane 表现出乎意料

来自/到统一内存的 memcpy 是否表现出同步行为?

图像扩展了flex父级的高度,但在chrome和safari中表现出怪异的表现

在统一初始化中初始化vector <std :: string>

初始化一对constexpr std :: array

具有相同初始条件的混沌摆表现出的混沌行为

为什么这表现出与max-width:0相同的方式?

QTime在Linux和Windows平台上表现出不同

React.Component和React.PureComponent表现出不同的行为

聚合物核和纸元素的性能表现出众

Java FileInputStream在Windows和Linux中表现出不同的行为

总和值在忽略 #VALUE 时表现出色!和#N/A 同时?

表明贪心算法表现出最优子结构和贪心选择

日期度量以过滤表现出不一致行为的值

模板类的一些友元函数表现出未定义的引用

统一初始化int *:如何强制执行?

C ++-具有std :: string的统一初始化程序

std :: pair <vector <int>,double>的初始化列表

javascript-字符串对象实例在浏览器和nodejs中表现出不同的行为

使用PowerShell.exe的启动过程在嵌入的单引号和双引号中表现出不同的行为

具有正则表达式和注释的Perl程序表现出奇怪的行为

当将Authorize和AllowAnonymous元数据应用于控制器时,它们会表现出不同的行为

Univocity bean处理器在分布式系统中表现出不一致的行为

GIT-同一目录,但不同的操作系统表现出奇怪的作用

带有多个过滤器的总和与或运算符一起表现出色?