2016-07-12 6 views
-1

Я изучил auto, и я знаю, что он выводит типы из инициализированных значений. Если я попытался написать некоторые рекомендации по использованию auto, могу ли я приводить ниже инструкции в качестве правил?Правило большого пальца для использования auto && и const auto &

  1. Использование auto && для всех значений (R-значений и L-значения, как это универсальный реф), которые модифицируемые,
  2. auto && даже для чтения только значения,
  3. Использование auto везде, где это возможно (индивидуальное предпочтение для стиля кодирования).

РЕДАКТИРОВАТЬ

class Test 
{ 
public: 
    Test() = default; 
    Test(const Test&) = default; 
    Test(Test&&) = default; 

    int i = 1; 
}; 

Test getObj() 
{ 
    return Test(); 
} 

Test& getObjByRef() 
{ 
    static Test tobj; 
    return tobj;  
} 

const Test getObjConst() 
{ 
    return Test(); 
} 

int main() 
{ 
    auto && obj1 = getObj(); 
    obj1.i = 2; 

    std::cout << " getObj returns: " << getObj().i << std::endl; 

    auto&& obj2 = getObjByRef(); 
    obj2.i = 3; 

    std::cout << " getObjByRef returns: " << getObjByRef().i << std::endl; 

    auto && obj3 = getObjConst(); 

    //obj3.i = 4; => //Error C3490 'i' cannot be modified because it is being accessed through a const object 

    return 0; 
} 

Таким образом, в приведенном выше примере я использовал auto && для всех трех функций

  • getObj
  • getObjByRef
  • getObjConst

И он работает должным образом. Теперь я могу заключить, что:

  • auto && может быть использован для хранения (инициализировать) любое значение, ИЛИ
  • Мы можем использовать auto && все возможные места.

Вы видите какую-то ошибку в этом подходе?

+0

Не используйте авто &&. Используйте либо обычный тип, либо константу. Если вы не реализуете перемещение ctor – user3104201

+1

http://stackoverflow.com/a/13242177/2352671 – 101010

+0

N.B. теперь это называется ссылкой на пересылку, а не универсальной ссылкой. –

ответ

-4

1) Да 2) Да 3) Как вы сказали, 'индивидуальные предпочтения для кодирования стиля'

+1

Не могли бы вы объяснить свои ответы? Я думаю, что вопроситель ищет аргументацию за или против своих предлагаемых рекомендаций. – jotrocken

+0

@jotrocken 1) 'auto &&' является универсальной ссылкой, может быть привязана как к l, так и к значению r. Я бы не использовал его всегда, но это, безусловно, возможно. 2) 'const auto &' является ссылкой только для чтения, вы можете использовать только методы const на этом объекте. 3) это зависит от разработчика, если он/она хочет использовать auto и позволить компилятору вывести тип или записать тип самостоятельно. ОП спросил, истинны ли эти утверждения. – paweldac

+0

@paweldac as for 1) вы сказали, что не будете использовать его всегда, так что у вас есть недостаток, который предотвращает его использование * всегда * (кроме немодифицируемых элементов) => Он быстро сопоставим с простым авто .. правый? –