3

第一::

double & val = 66.6;     //illegal
const double & val = 66.6;   //legal

我只是在做一些演示程序并通过了上述概念,但无法确定上述概念的确切需求。在第二种情况下 const 到底在做什么?

第二个::

int nVar = 12;
int &rVar = nVar ;//Ok
double &dVar = nVar ;//Error
const double &cdVar = nVar ;//Ok

为什么第 3 条语句在第 4 条语句起作用的地方不起作用?

4

5 回答 5

6

第一个是非法的。您不能将非常量引用绑定到临时对象。

二是合法。它创建一个临时的 double,初始化为66.6,并对它val进行 const 引用。

承诺不会通过const引用改变值。C++ 不允许您将非常量引用绑定到临时对象,因为这通常是一个错误。

于 2012-12-24T11:44:11.513 回答
3

让我演示给你看。

void f(Base*& p) { p = new Base; }
int main() {
    Derived* d;
    f(d); // Creates temporary Base* and calls f with it
    // Dude, where's my object?
}

如您所见,这引入了一个令人讨厌的错误。首先,对象被泄露并且无法恢复,因为 to 的参数f实际上根本没有引用d。其次,即使在d中成功变异f,也会是错误的类型,违反类型系统。

于 2012-12-24T11:56:05.943 回答
2

由于 val 是对另一个变量的引用,理论上这就像在旧的 fortran 时代一样,将 1.0 作为引用传递给函数(无论在 fortran 中调用什么方法),您可以将 1.0 更改为其他内容。其他使用 1.0 作为常量的代码将使用新值。我会说,不允许这样做是个好主意。

所以,C++ 标准只允许对任何你不应该修改的东西进行常量引用——如果你以后这样做,你期望什么效果val += 4.0?常数 66.6 变成 70.6?

编辑:我认为情况是你有一个功能

void func(double &d)
{
    d += 4.0;
}

你不能把它称为:

func(66.6);

所以你尝试了:

double &val = 66.6;

那也没用?

解决此问题的正确方法是:

double val = 66.6;

func(val);    // compiler makes a reference to val that is passed to func. 
于 2012-12-24T11:52:05.003 回答
1

double & val = 66.6;

这不会编译,您不能将引用绑定到临时对象。

const double & val = 66.6;

这是有效的,并且会导致对临时 的引用66.6

我看不出有任何理由将值声明为引用,将其创建为 a const double val = 66.6;,然后如果以后需要将其作为引用传递。

于 2012-12-24T11:51:42.273 回答
1

第二种情况下的 const 告诉编译器不要复制右边的值。在您的情况下,这并没有太大区别(编译器可能会生成相同的代码)。

但在以下情况下,结果someFunction不是复制而是分配。如果它发生很多或者返回的对象的副本很昂贵,这将特别有用。

const double & val = someFunction();

您实际上在做的是扩展堆栈上值/对象的“生命周期”,而不是复制它。这被称为“临时”。由于创建值/对象的代码不知道您将使用它,因此您必须制作它const

于 2012-12-24T11:52:57.143 回答