C++ 传递与常量和非常量引用相同的对象
以下代码使用g++v4.8.1进行编译并输出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,
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人的海报,你经常会遇到这些“哑巴”。