为什么 const 变量不能通过引用传递?
Why a const variable cannot be passed by reference?
我的讲义说
The argument to a reference parameter must be a variable, not a
constant or an expression.
因此
int f(double & var); // function prototype
...
const double t = 4.0;
int ret = f(t);
f(t)
是非法的。
但是我不明白,为什么t
是非法的。 t
是一个常量,但仍然是一个变量,我认为通过引用传递 t
没有任何错误。
如果函数f
修改var
怎么办?如果 t
是 const
.
,那不应该发生
下面是 f
的示例实现:
int f(double & var)
{
var += 1;
return var;
}
这将更改作为参数传递的任何内容。 但是如果参数是const
...真倒霉。那么这是不允许的,编译器会明确告诉你这一点。
这是编译器产生的错误:
error: binding reference of type 'double&' to 'const double' discards qualifiers
因此,通过将 const
变量传递给函数(不带非常量参数),您是在告诉编译器首先忽略变量的 const
ness。
如果您希望通过引用传递它,请通过 const
-reference:
传递
int f(const double & var) // or int f(double const& var)
{
var += 1;
return var;
}
这告诉编译器保留其参数的常量性。
当你有一个引用参数时,传递的对象需要实际(至少能够)占用内存,而常量(与 const 变量相反)则不需要。
I.E.以下是可以的:
void foo(int & n) {
n = 3;
}
void bar() {
int i;
foo(i);
std::cout << "i is " << i << std::endl;
}
但如果你有:
void qux() {
foo(3);
}
foo 中没有对象可以赋值给。
请注意,您可以将常量作为常量引用(即 MyType const &)传递,这是允许的,因为当引用是常量时不存在赋值问题。
让我加强对答案的评论:
首先,t
不是常量,而是const变量。常数为 4.0。你的讲义基本上是说你不能做像 int ret = f(4.0);
这样的事情
其次,您看到的是类型不匹配。 const
作为限定符是类型的一部分。您不能执行以下操作:
const int x = 1;
int& ref_x = x;
error: binding reference of type ‘int&’ to ‘const int’ discards
qualifiers
然而,传递 const
限定变量作为引用是合法的,要么使用 const 引用,要么丢弃 const:
- 使用常量引用
const int& const_int_ref = x;
- 使用const_cast:
int& rx = const_cast<int&>(x);
尽可能选择第一个。
我的讲义说
The argument to a reference parameter must be a variable, not a constant or an expression.
因此
int f(double & var); // function prototype
...
const double t = 4.0;
int ret = f(t);
f(t)
是非法的。
但是我不明白,为什么t
是非法的。 t
是一个常量,但仍然是一个变量,我认为通过引用传递 t
没有任何错误。
如果函数f
修改var
怎么办?如果 t
是 const
.
下面是 f
的示例实现:
int f(double & var)
{
var += 1;
return var;
}
这将更改作为参数传递的任何内容。 但是如果参数是const
...真倒霉。那么这是不允许的,编译器会明确告诉你这一点。
这是编译器产生的错误:
error: binding reference of type 'double&' to 'const double' discards qualifiers
因此,通过将 const
变量传递给函数(不带非常量参数),您是在告诉编译器首先忽略变量的 const
ness。
如果您希望通过引用传递它,请通过 const
-reference:
int f(const double & var) // or int f(double const& var)
{
var += 1;
return var;
}
这告诉编译器保留其参数的常量性。
当你有一个引用参数时,传递的对象需要实际(至少能够)占用内存,而常量(与 const 变量相反)则不需要。
I.E.以下是可以的:
void foo(int & n) {
n = 3;
}
void bar() {
int i;
foo(i);
std::cout << "i is " << i << std::endl;
}
但如果你有:
void qux() {
foo(3);
}
foo 中没有对象可以赋值给。
请注意,您可以将常量作为常量引用(即 MyType const &)传递,这是允许的,因为当引用是常量时不存在赋值问题。
让我加强对答案的评论:
首先,t
不是常量,而是const变量。常数为 4.0。你的讲义基本上是说你不能做像 int ret = f(4.0);
其次,您看到的是类型不匹配。 const
作为限定符是类型的一部分。您不能执行以下操作:
const int x = 1;
int& ref_x = x;
error: binding reference of type ‘int&’ to ‘const int’ discards qualifiers
然而,传递 const
限定变量作为引用是合法的,要么使用 const 引用,要么丢弃 const:
- 使用常量引用
const int& const_int_ref = x;
- 使用const_cast:
int& rx = const_cast<int&>(x);
尽可能选择第一个。