将 int 分配给 double&
Assigning a int to a double&
我想了解为什么这不能编译:
int main()
{
int a = 1;
double& b = a;
std::cout << b;
}
虽然使用 double const& b = a
而不是 double& b = a
效果很好。
A double
和 int
有不同的对齐要求和内存中的不同表示。通过另一种类型的眼睛将变量作为一种类型读取也会使您的程序具有未定义的行为。
当你做类似
的事情时
int a = 1;
double b = a; // note, not a reference
然后 a
隐式转换为临时 double
,然后分配给 b
。如果你改为
double& b = a;
然后 b
尝试引用临时文件 double
,这是无效的,因为临时文件将在表达式末尾被销毁。
您 可以 然而,通过使用 const&
可以延长表达式末尾的临时文件的生命周期。然后临时对象的生命周期将延长到引用生命周期的末尾(作用域的末尾)。
示例:
const double& b = a; // valid, but usually pointless
关于您对问题的补充:
While using double const& b = a
instead of double& b = a
works fine
那只是因为“标准是这么说的”。对临时文件的非 const&
意味着您想对该临时文件进行更改 - 这通常是错误的,在这些情况下您可能想要 double
而不是 double&
。
我想了解为什么这不能编译:
int main()
{
int a = 1;
double& b = a;
std::cout << b;
}
虽然使用 double const& b = a
而不是 double& b = a
效果很好。
A double
和 int
有不同的对齐要求和内存中的不同表示。通过另一种类型的眼睛将变量作为一种类型读取也会使您的程序具有未定义的行为。
当你做类似
的事情时int a = 1;
double b = a; // note, not a reference
然后 a
隐式转换为临时 double
,然后分配给 b
。如果你改为
double& b = a;
然后 b
尝试引用临时文件 double
,这是无效的,因为临时文件将在表达式末尾被销毁。
您 可以 然而,通过使用 const&
可以延长表达式末尾的临时文件的生命周期。然后临时对象的生命周期将延长到引用生命周期的末尾(作用域的末尾)。
示例:
const double& b = a; // valid, but usually pointless
关于您对问题的补充:
While using
double const& b = a
instead ofdouble& b = a
works fine
那只是因为“标准是这么说的”。对临时文件的非 const&
意味着您想对该临时文件进行更改 - 这通常是错误的,在这些情况下您可能想要 double
而不是 double&
。