const类方法是否可以防止在类外部分配变量?

时间:2019-03-29 19:46:31

标签: c++ c++11

我已经解决了通过删除“ const”来编译此代码的问题。但是,为什么在这种特定情况下我似乎无法在const类方法中分配非类成员?它可能是课程的一部分;但是,我不明白为什么。

我可以编译代码,但是在这种情况下我很困惑。

下面是该类中的一些声明。

using twoDList = multimap<string,string>;
twoDList SomeMultiMap;

当我取下“ const”时,这将起作用。或至少编译。虽然,在这里我只是分配仅在此函数中声明的迭代器。顺便使用命名空间标准。

bool object::foo(string a, string b) const
{
    pair<object::twoDList::iterator,object::twoDList::iterator> wordRange;
    wordRange = SomeMultiMap.equal_range(a);

    object::twoDList::iterator it = wordRange.first;

    //...
    //...
    //...
}

我希望该函数在不删除const的情况下进行编译,但不会编译。

编辑:这是编译错误,我在Linux命令行上使用它。

g++ -g -DDEBUG -std=c++11 -c test1.cpp
In file included from /usr/include/c++/4.8/bits/stl_algobase.h:64:0,
                 from /usr/include/c++/4.8/bits/char_traits.h:39,
                 from /usr/include/c++/4.8/ios:40,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from test1.cpp:1:
/usr/include/c++/4.8/bits/stl_pair.h: In instantiation of ‘std::pair<_T1, _T2>& std::pair<_T1, _T2>::operator=(std::pair<_U1, _U2>&&) [with _U1 = std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >; _U2 = std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >; _T1 = std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >; _T2 = std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]’:
test1.cpp:15:15:   required from here
/usr/include/c++/4.8/bits/stl_pair.h:188:10: error: no match for ‘operator=’ (operand types are ‘std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’ and ‘std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’)
    first = std::forward<_U1>(__p.first);
          ^
/usr/include/c++/4.8/bits/stl_pair.h:188:10: note: candidates are:
In file included from /usr/include/c++/4.8/map:60:0,
                 from test1.cpp:2:
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note: std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >& std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >::operator=(const std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&)
     struct _Rb_tree_iterator
            ^
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note:   no known conversion for argument 1 from ‘std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’ to ‘const std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&’
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note: std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >& std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >::operator=(std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&&)
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note:   no known conversion for argument 1 from ‘std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’ to ‘std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&&’
In file included from /usr/include/c++/4.8/bits/stl_algobase.h:64:0,
                 from /usr/include/c++/4.8/bits/char_traits.h:39,
                 from /usr/include/c++/4.8/ios:40,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from test1.cpp:1:
/usr/include/c++/4.8/bits/stl_pair.h:189:11: error: no match for ‘operator=’ (operand types are ‘std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’ and ‘std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’)
    second = std::forward<_U2>(__p.second);
           ^
/usr/include/c++/4.8/bits/stl_pair.h:189:11: note: candidates are:
In file included from /usr/include/c++/4.8/map:60:0,
                 from test1.cpp:2:
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note: std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >& std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >::operator=(const std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&)
     struct _Rb_tree_iterator
            ^
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note:   no known conversion for argument 1 from ‘std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’ to ‘const std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&’
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note: std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >& std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >::operator=(std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&&)
/usr/include/c++/4.8/bits/stl_tree.h:157:12: note:   no known conversion for argument 1 from ‘std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >’ to ‘std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >&&’
makefile:10: recipe for target 'test1.o' failed
make: *** [test1.o] Error 1

编辑:更多编辑以修复范围运算符。另外,还添加了以下事实:如果有帮助,我正在使用命名空间std。

1 个答案:

答案 0 :(得分:1)

成员函数的参数列表后的this是一个承诺,它不会通过this指针更改类对象。 const ClassType*的类型变为ClassType*,而不仅仅是const。 (就像任何指向const的指针或指向const的指针一样,这仅意味着无法使用该指针或引用来更改事物,而不是表示该对象是永久const或无法通过其他方式更改。) / p>

要说一个类对象被视为mutable,则意味着其所有成员(除任何标记的const之外)都被视为N。而且,由于在成员函数定义中,普通的非静态成员名称this->N实际上与const的含义相同,因此,当函数声明具有{{ 1}}。

因此在const内部,名称bool object::foo(string a, string b) constSomeMultiMap的成员,被视为object。并且equal_rangeconst SomeMultiMap对象表达式为pair<const_iterator, const_iterator>时给出multimap,或者仅在对象表达式不是const时才给出pair<iterator, iterator>。 / p>

所以这可能会起作用(取决于您以后需要执行的操作):

const

(请注意,由于成员函数主体在其类的作用域内,因此通常不需要std::pair<twoDList::const_iterator,twoDList::const_iterator> wordRange; wordRange = SomeMultiMap.equal_range(a); twoDList::const_iterator it = wordRange.first; 前缀。)

尽管我只是用object::定义了这些变量,以避免需要完全正确地键入类型,并节省了键入那些长迭代器名称的时间。

auto