作弊常数?

问题描述 投票:0回答:1

我发现了一个奇怪的(至少对我来说)行为,在下面的代码中,函数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;
}

编辑:

正如向我指出的那样,我的编译详细信息是胡说八道。因此,我删除了它们。

c++ const
1个回答
4
投票

a_内部修改b.Compute()引用的对象是合法的,因为您没有在修改a_。创建成员函数const意味着您无法修改存储在成员变量中的值,但是对于引用来说,这已经是不可能的(永远不能更改为引用新对象)。

您在没有C ++ 17标志的情况下无法编译与常量性无关。阅读错误消息;他们告诉您您正在尝试从InstantiateA()函数调用已删除的move / copy构造函数,没有C ++ 17的延迟实现功能是不允许的。

[如果您不愿意将minimal example放在一起,则可能自己会学到这一切。

© www.soinside.com 2019 - 2024. All rights reserved.