以下代码使用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
参考。
答案 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引用将允许它。