【发布时间】:2019-10-27 04:54:03
【问题描述】:
考虑以下代码:
#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,而@987654327 @ 和 sizeof(char) == 1 的定义)。如果引用不是const,则编译失败(例如,float func(char & val1, unsigned int & val2) 而不是当前定义)并出现错误:
无法将“char&”类型的非常量左值引用绑定到“char”类型的右值
在 Godbolt 上使用 GCC、Clang、ICC 和 MSVC 进行测试时,我得到了完全相同的行为,因此它看起来是标准的。什么是 const-references 导致它被接受,而引用却不是?另外,我使用了-Wall -pedantic - 为什么我没有收到关于缩小转换的警告?当函数按值而不是按引用传递时,我会这样做...
【问题讨论】:
-
缩小转换只在与list initialization 相关的标准中提及。您没有这样做,因此您不会收到缩小转换警告。另见stackoverflow.com/questions/52443036/…
标签: c++ language-lawyer reference-binding