将相同的对象作为const和非const引用传递

时间:2014-07-28 16:20:13

标签: c++ const

以下代码使用g ++ v4.8.1编译并输出45,但它的编译是否基于标准保证?其他编译器会抱怨吗?

#include <iostream>
#include <vector>

void test(const std::vector<int>& a, std::vector<int>& b) {
  b[0] = 45;
}

int main() {
  std::vector<int> v(1,0);
  test(v, v);
  std::cout << v[0] << std::endl;
}

我知道函数定义没有任何内在错误,但是当使用相同的对象test调用v时,我有点期待一个警告,即我将一个对象作为一个{ {1}}和非const参考。

3 个答案:

答案 0 :(得分:6)

没有问题,因为编译器将这两个参数视为不同的引用。要理解代码,请考虑以下示例

int i = 10;
const int &cr = i;
int &r = i;

r = 20;

std::cout << cr << std::endl;

答案 1 :(得分:2)

没有理由不编译。 你的向量不是const,你可以在const或可变的上下文中使用它。

这与以下方式相同:

int i = 42;
const int& const_ref = i;
int& ref = i;

你是否绑定了同一个对象或者没有任何关联对象。

你应该看看这个,好像动物园里有狮子,窗户后面的访客不能碰他,而训练师可以喂他,但它仍然是同一只狮子。

答案 2 :(得分:2)

是的,这是正确的。 const引用可以绑定到非const对象。这当然是这种情况,因为非const对象为什么会关心函数修改它,这是const确保的? (至少,它确保不通过该特定引用修改对象,尽管可以通过另一个非const引用修改

然而,相反的情况并非如此。您不能将非const引用绑定到const对象。事实上,如果函数修改了一个const对象,那么非const引用将允许它。