C ++ 11 auto: что, если он получает постоянную ссылку?

Пожалуйста, взгляните на следующий простой код:

class Foo { public: Foo(){} ~Foo(){} Foo(const Foo&){} Foo& operator=(const Foo&) { return *this; } }; static Foo g_temp; const Foo& GetFoo() { return g_temp; } 

Я попытался использовать auto следующим образом:

 auto my_foo = GetFoo(); 

Я ожидал, что my_foo будет постоянной ссылкой на Foo , который является возвращаемым типом функции. Тем не менее, тип auto – это Foo , а не ссылка. Кроме того, my_foo создается путем копирования g_temp . Такое поведение для меня не так очевидно.

Чтобы получить ссылку на Foo , мне нужно было написать вот так:

 const auto& my_foo2 = GetFoo(); auto& my_foo3 = GetFoo(); 

Вопрос : Почему auto выводит возвращаемый тип GetFoo как объект, а не ссылку?

Прочтите эту статью: появление и исчезновение consts в C ++


Вывод типа для автоматических переменных в C ++ 0x по существу такой же, как и для параметров шаблона. (Насколько мне известно, единственное различие между ними состоит в том, что тип автоматических переменных можно выводить из списков инициализаторов, в то время как типы параметров шаблона могут не быть.) Каждая из следующих деклараций поэтому объявляет переменные типа int ( никогда не const int):

 auto a1 = i; auto a2 = ci; auto a3 = *pci; auto a4 = pcs->i; 

При выводе типа для параметров шаблона и автоматических переменных удаляются только константы верхнего уровня. Если шаблон функции принимает указатель или ссылочный параметр, сохраняется постоянство того, что указано или указано:

 template void f(T& p); int i; const int ci = 0; const int *pci = &i; f(i); // as before, calls f, ie, T is int f(ci); // now calls f, ie, T is const int f(*pci); // also calls f, ie, T is const int 

Это поведение – старые новости, применяемые как к C ++ 98, так и к C ++ 03. Соответствующее поведение для автоматических переменных, конечно, новое для C ++ 0x:

 auto& a1 = i; // a1 is of type int& auto& a2 = ci; // a2 is of type const int& auto& a3 = *pci; // a3 is also of type const int& auto& a4 = pcs->i; // a4 is of type const int&, too 

Поскольку вы можете сохранить cv-квалификатор, если тип является ссылкой или указателем, вы можете сделать:

 auto& my_foo2 = GetFoo(); 

Вместо того, чтобы указывать его как const (то же самое относится к volatile ).

Изменить. Что касается того, почему auto выводит возвращаемый тип GetFoo() в качестве значения вместо ссылки (что было вашим основным вопросом, извините), рассмотрите это:

 const Foo my_foo = GetFoo(); 

Вышеприведенная копия создаст копию, так как my_foo – значение. Если auto должно было возвращать ссылку lvalue, это было бы невозможно.

  • что такое возвращаемый тип оператора присваивания?
  • Разница между std :: reference_wrapper и простым указателем?
  • Почему «универсальные ссылки» имеют тот же синтаксис, что и ссылки rvalue?
  • Возможна ли пустая ссылка?
  • Как обратиться к документации Microsoft.Office.Interop.Excel?
  • Понимание classов ссылок Java: SoftReference, WeakReference и PhantomReference
  • Почему C # не поддерживает возврат ссылок?
  • Что такое «корневая ссылка»?
  • Java: разница между сильным / мягким / слабым / фантомным ссылкой
  • Разница между константой const и нормальным параметром
  • Тип возврата '?:' (Тернарный условный оператор)
  • Давайте будем гением компьютера.