C++ 传递与常量和非常量引用相同的对象

C++ 传递与常量和非常量引用相同的对象,c++,constants,C++,Constants,以下代码使用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,

以下代码使用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;
}
#包括
#包括
无效测试(常数std::vector&a、std::vector&b){
b[0]=45;
}
int main(){
std::向量v(1,0);
试验(v,v);

std::cout没有理由不编译它。 向量不是常量,然后可以在常量或可变上下文中使用它

与此工作原理相同:

int i = 42;
const int& const_ref = i;
int& ref = i;
您是否绑定同一对象在这里没有任何关联


你应该把这看成动物园里有一头狮子,窗户后面的游客不能碰它,而训练员可以喂它,但它仍然是同一头狮子。

是的,这是正确的。常量引用可以绑定到非常量对象。当然是这样,因为如果函数不修改,为什么非常量对象会在意呢它,这是常量确保的?(至少,它确保对象不会通过该特定引用进行修改,尽管它可以通过另一个非常量引用进行修改)


相反,不是真的。你不能将一个非const引用绑定到一个const对象。如果函数修改它,const对象实际上会关心它,这是非const引用允许的。

没有问题,因为编译器把这两个参数看作不同的引用。样品

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

r = 20;

std::cout << cr << std::endl;
inti=10;
常数int&cr=i;
int&r=i;
r=20;

std::难道你希望编译器拒绝这个吗?也许它会发现我传递的对象与
const
和非
const
引用的对象相同,这似乎是矛盾的。@glinka:没有矛盾。对可变对象进行
const
引用是完全安全和明智的,可以防止修改通过该引用,所以语言允许这样做。相反,对
const
对象进行可变引用是不安全的,所以这是不允许的。是的,我理解这一点;但是,我觉得编译器可能/应该通过将
v
作为两个参数传递给
tes来阻止我对对象做出如此矛盾的声明t
。您没有声明,这是一种常见的情况。顺便说一句,编译器可能希望警告变量
a
已定义,但未在
test()中使用
+1你的回答简洁而准确地解释了这个行为。你是唯一回答了我想问的问题的人,谢谢。我相信你的意思是第一行的
int I
。我不能编辑它。@glinka谢谢。这是一个打字错误。@glinka:如果你的问题比你文章中实际写的更具体,然后你应该编辑你的帖子。我想标题可能就足够了,但我可以看到混淆的地方。特别是作为一张17人的海报,你经常会遇到这些“哑巴”。