考虑以下代码:
#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;
}
尽管我将 a 传递double
给一个函数,该函数接受对小于 a 的类型的 const 引用double
(在我的系统上,sizeof(double) == 8
, whilesizeof(unsigned int) == 4
和sizeof(char) == 1
根据定义),但它仍会编译并运行。如果引用不是const
,则编译失败(例如, float func(char & val1, unsigned int & val2)
而不是当前定义)并出现错误:
无法将“char&”类型的非常量左值引用绑定到“char”类型的右值
在 Godbolt 上使用 GCC、Clang、ICC 和 MSVC 进行测试时,我得到了完全相同的行为,因此它看起来是标准的。什么是 const-references 导致它被接受,而引用却不是?另外,我使用-Wall -pedantic
了 - 为什么我没有收到有关缩小转换的警告?当函数通过值而不是通过引用传递时,我会这样做......