我发现了一个奇怪的(至少对我来说)行为,在下面的代码中,函数B::Compute() const
修改了一个非常量成员。我以为这是不允许的,特别是因为我不打算欺骗constness,例如通过const_cast
或类似方式。但是,代码会编译((请参阅下面的详细信息)。为什么会这样?
#include <vector>
#include <iostream>
class A {
std::vector<int> v_;
public:
void AddToA( int const e ) {
v_.push_back( e );
}
void Print() const {
for( auto const& v : v_ ) {
std::cout << v << "\t";
}
std::cout << "\n";
}
};
class B {
A & a_;
public:
void Compute() const {
a_.AddToA( 1 );
}
};
int main() {
A a = A();
B b = B( a );
B b2 = B( a );
b.Compute();
a.Print();
b2.Compute();
a.Print();
return 0;
}
编辑:
正如向我指出的那样,我的编译详细信息是胡说八道。因此,我删除了它们。
从a_
内部修改b.Compute()
引用的对象是合法的,因为您没有在修改a_
。创建成员函数const
意味着您无法修改存储在成员变量中的值,但是对于引用来说,这已经是不可能的(永远不能更改为引用新对象)。
您在没有C ++ 17标志的情况下无法编译与常量性无关。阅读错误消息;他们告诉您您正在尝试从InstantiateA()
函数调用已删除的move / copy构造函数,没有C ++ 17的延迟实现功能是不允许的。
[如果您不愿意将minimal example放在一起,则可能自己会学到这一切。