gpt4 book ai didi

c++ - 为什么 double 可转换为看似任何原始类型的 const 引用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:08 27 4
gpt4 key购买 nike

考虑以下代码:

#include <iostream>

float func(char const & val1, unsigned int const & val2)
{
return val1 + val2;
}

int main() {
double test1 = 0.2;
double test2 = 0.3;

std::cout << func(test1, test2) << std::endl;

return 0;
}

尽管我将 double 传递给一个函数,该函数采用对小于 double 的类型的常量引用(在我的系统,sizeof(double) == 8,而 sizeof(unsigned int) == 4,以及 sizeof(char) == 1根据定义)。如果引用不是 const,则编译失败(例如,float func(char & val1, unsigned int & val2) 而不是当前定义)并出现错误:

cannot bind non-const lvalue reference of type 'char&' to an rvalue of type 'char'

在 Godbolt 上使用 GCC、Clang、ICC 和 MSVC 测试时,我得到了完全相同的行为,所以它看起来很标准。 const-references 是什么导致 this 被接受,而 reference 不被接受?另外,我使用了 -Wall -pedantic - 为什么我没有收到有关缩小转换的警告?当函数按值而不是按引用传递时,我会这样做...

最佳答案

确实是标准的

test1test2 被转换为匿名临时 charunsigned 类型函数中的 const 引用是适当的绑定(bind)。如果您将编译器设置为警告您缩小转换(例如 -Wconversion),它会输出一条消息。

如果函数参数是非 const 引用,则这些绑定(bind)是不可能的,并且您的编译器在这种情况下会正确发出诊断。

一个解决方法是删除一个更好的重载匹配:

float func(double, double) = delete;

关于c++ - 为什么 double 可转换为看似任何原始类型的 const 引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56566203/

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