Auto from const std::vector <> &; объект или ссылку?
предположим, что у нас есть объект со следующим интерфейсом:
struct Node_t {
... const std::vector< something >& getChilds() const;
} node;
Теперь я обращаюсь к свойству с переменной auto
следующим образом:
auto childs = node->getChilds();
каков тип childs
? a std::vector< something >
или ссылку на один?
Ответы
Ответ 1
Тип childs
будет std::vector<something>
.
auto
работает по тем же правилам, что и вывод типа шаблона. Тип, выбранный здесь, будет таким же, который был бы выбран для template <typename T> f(T t);
в вызове типа f(node->getChilds())
.
Аналогично, auto&
предоставит вам тот же тип, который будет выбран с помощью template <typename T> f(T& t);
, а auto&&
предоставит вам тот же тип, который будет выбран с помощью template <typename T> f(T&& t);
.
То же самое относится ко всем другим комбинациям, таким как auto const&
или auto*
.
Ответ 2
Это a std::vector<something>
. Если вы хотите ссылку, вы можете сделать это:
auto & childs = node->getChilds();
Это, конечно, будет ссылкой на константу.
Ответ 3
auto
дает вам std::vector<something>
. Вы можете указать спецификатор ссылки auto &
или, альтернативно, вы можете использовать decltype
:
decltype( node->getChilds() ) childs = node->getChilds();