3
#include <iostream> #include <boost/shared_ptr.hpp> using namespace std; class A { public: const shared_ptr<const int> getField () const { return field_; } private: shared_ptr<int> field_; }; void f(const A& a) { auto v = a.getField(); //why auto doesn't a const shared_ptr<const int> here ? v.reset(); //OK: no compile error } int main() { A a; f(a); std::cin.ignore(); } 

In the above code why does the compiler deduce v's type as shared_ptr<int> and not as const shared_ptr<const int> the type returned by getField?

EDIT: MSVC2010

1

1 Answer 1

8

auto ignores references and top level consts. If you want them back, you have to say so:

const auto v = a.getField(); 

Note that getField returns a copy of field_. Are you sure you dont want a reference to const?

const shared_ptr<int>& getField () const; auto& v = a.getField(); 
Sign up to request clarification or add additional context in comments.

5 Comments

why don't you write: const auto& v = a.getField(); ?
Because the const is automatically inferred in this case.
That could probably benefit from some clarification. Superificially if I take const int&, ignore the reference (const int) and the now top level const I get int.
what is a const which it is not qualified "top level" ?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.