авто и константный объект - PullRequest
3 голосов
/ 21 января 2012
#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();
}

В приведенном выше коде почему компилятор выводит тип v как shared_ptr<int>, а не как const shared_ptr<const int> тип, возвращаемый getField?

EDIT: MSVC2010

Ответы [ 2 ]

7 голосов
/ 21 января 2012

auto игнорирует ссылки и верхний уровень const с. Если вы хотите их вернуть, вы должны сказать так:

const auto v = a.getField();

Обратите внимание, что getField возвращает копию field_. Вы уверены, что не хотите ссылаться на const?

const shared_ptr<int>& getField () const;

auto& v = a.getField();
0 голосов
/ 21 января 2012

В новом стандарте C ++ 11 я думаю, что ключевое слово auto, используемое в этом контексте, заменяется компилятором на любой тип, возвращаемый a.getField(). Это ярлык для программиста.

См. http://en.wikipedia.org/wiki/C%2B%2B11#Type_inference

...