C ++ 11 자동 키워드가 너무 많습니까?


218

auto복잡한 템플릿 형식에 대해 C ++ 11 표준에서 사용할 수 있는 새로운 키워드를 사용하고 있습니다. 그러나 나는 또한 그것을 다음과 같은 것들에 사용하고 있습니다 :

auto foo = std::make_shared<Foo>();

그리고 더 회의적으로 :

auto foo = bla(); // where bla() return a shared_ptr<Foo>

나는이 주제에 대해 많은 논의를 보지 못했다. auto유형은 종종 문서 및 위생 검사의 한 형태이기 때문에 과도하게 사용될 수있는 것 같습니다 . 사용 라인을 어디 auto에서 그리고이 새로운 기능에 권장되는 사용 사례는 무엇입니까?

명확히하기 위해 : 나는 철학적 의견을 요구하지 않습니다. 표준위원회에서이 키워드의 의도 된 사용을 요청하고 있으며, 의도 된 사용이 실제로 어떻게 실현되는지에 대한 의견이있을 수 있습니다.

참고 :이 질문은 SE.Programmers로 옮겨졌다가 다시 Stack Overflow로 돌아 왔습니다. 이것에 대한 논의는이 메타 질문 에서 찾을 수 있습니다 .


이 사이트는 토론 사이트가 아닌 Q & A 사이트입니다. 당신은 매우 일반적인 질문을했고, 누군가가 당신에게 매우 주관적인 것 이외의 것을 줄 수 있을지 의심합니다. (그 이유 -1)
TravisG

15
@heishe, 나는 설명을 추가했습니다. 당신은 매우 일반적으로 질문을 읽는다면, 그것은 주관적인 의견을 묻는 것으로 보인다 않지만, 당신이 사용 정말로 경우 auto키워드를, 당신은 그것을 어떻게 알고 가정 사용할 수 있습니다. 이것이 내가이 기능을 처음 접하는 사람으로서 내가 요구하는 것, 어떻게 사용해야합니까?
Alan Turing

13
나는 C #이 소개되었을 때 var(즉, 사람들이 결국 동적 타이핑이 아니라는 아이디어를 얻었을 때)이 토론을 보았습니다 . 원하는 경우이 질문으로 시작 하여 관련 질문을 진행할 수 있습니다 .
R. Martinho Fernandes

2
@Lex : 어떤 것이 합법적 이거나 합법적 이지 않습니다. 합법적 인 "나쁜"것을 부르는 것은 정의에 따라 주관적입니다. 즉, auto foo = bla();"나쁜" 이라고 부르는 것은 분명히 사실이 아니라 의견이며,이 질문을하고 토론에 답변하는 것은 프로그래머 SE와 관련이 있습니다. /
shrug

3
이 문제에 허브 셔터보기 : herbsutter.com/2013/06/13/...
rafak

답변:


131

auto첫눈에 유형을 작성하는 방법을 말하기가 어려울 때마다 키워드를 사용해야한다고 생각 하지만 표현식의 오른쪽 유형은 분명합니다. 예를 들어,

my_multi_type::nth_index<2>::type::key_type::composite_key_type::
    key_extractor_tuple::tail_type::head_type::result_type

복합 키 유형 boost::multi_index을 알고 있다고해도 int. int나중에 변경 될 수 있기 때문에 글을 쓸 수 없습니다 . 나는 쓴다 auto,이 경우.

은 if 그래서 auto키워드가 특정 경우에 가독성을 개선 한 후 사용하십시오. auto유형이 무엇을 auto나타내는 지 독자에게 분명 할 때 쓸 수 있습니다 .

여기 몇 가지 예가 있어요.

auto foo = std::make_shared<Foo>();   // obvious
auto foo = bla();                     // unclear. don't know which type `foo` has

const size_t max_size = 100;
for ( auto x = max_size; x > 0; --x ) // unclear. could lead to the errors
                                      // since max_size is unsigned

std::vector<some_class> v;
for ( auto it = v.begin(); it != v.end(); ++it )
                                      // ok, since I know that `it` has an iterator type
                                      // (don't really care which one in this context)

18
그것은 아주 좋은 추천처럼 보이지 않습니다. 객체의 유형을 모르는 빈도는? (템플릿 외부, 즉.) 입력 유형을 모르는 경우, 검색하고, 게으르지 말고 자동을 사용하십시오.
Paul Manta

9
@Paul : 종종 유형의 가장 중요한 부분을 알고 있거나 알아야 할 때가 종종 있습니다. 예를 들어 반복자이지만 벡터의 반복자인지 또는 연결된 반복자인지는 신경 쓰지 않습니다. 명부; 이 경우 유형을 작성하는 방법을 알아 내려고 시간과 화면 공간을 낭비하고 싶지 않습니다.
Lie Ryan

45
C ++ 다이어 드가 좋아하든 아니든 C ++ 0x는 C ++을 사용하지 않은 사람들을 끌어들일 것입니다. 그리고 그 곳곳에서 자동을 사용할 것입니다.
교수 Falken

6
@ R.MartinhoFernandes-아니요, 분명한 것은 bla() 반환 하는 것이 무엇이든 제공한다는 것 foo입니다.
Luis Machuca

8
@LuisMachuca 내 대답은 나쁜 변수와 함수 명명의 교과서 예제를 제공하고 형식 유추에 대한 가독성이 부족하다고 비난하는 것은 부정직 한 방법이었습니다.
R. Martinho Fernandes

62

부작용이 걱정되는 일이 없도록 auto가능한 모든 곳에서 사용하십시오 const auto. 명백한 경우를 제외하고 유형에 대해 걱정할 필요는 없지만 정적으로 검증되어 반복을 피할 수 있습니다. 어디 auto가능하지, 당신은 사용할 수 있습니다 decltype로 의미 유형을 표현하는 계약 식을 기반으로. 코드는 다르게 보일 것이지만 긍정적 인 변화가 될 것입니다.


12
특히 'const auto &'라고 말하면
Viktor Sehr

2
auto&&복잡한 상황에서 더 잘 사용 edmundv.home.xs4all.nl/blog/2014/01/28/…
KindDragon

2
@KindDragon : 그것은 엄지 손가락의 좋은 규칙이지만, 내가 사용하는 것을 선호 const auto&또는 const autoI 명시 적 돌연변이 또는 이동하지 않으려면.
Jon Purdy

" 당신이 할 수있는 모든 곳에 자동을 사용하십시오 ". 이것은 내가 auto str = std::string();대신 써야한다는 것을 의미합니까 std::string str;?
Calmarius

4
어디에서나 auto를 사용하면 코드를 읽는 동안 직접 유형을 추론해야하므로 코드를 읽기 어렵고 디버그하기가 더 어려워집니다.
서브 머신

52

쉬운. 유형이 무엇인지 신경 쓰지 않을 때 사용하십시오 . 예를 들어

for (const auto & i : some_container) {
   ...

내가 여기에서 신경 쓰는 i것은 컨테이너에있는 것입니다.

typedef와 비슷합니다.

typedef float Height;
typedef double Weight;
//....
Height h;
Weight w;

여기에, 난 상관 여부하지 않는 hw그들이 단지 것을, 수레 또는 복식있는 높이와 무게를 표현하기에 적합하다 어떤 유형 .

아니면 고려

for (auto i = some_container .begin (); ...

여기서 내가 걱정하는 것은 그것이 적절한 반복자이며 지원하는 operator++()것입니다.이 점에서 오리 타이핑과 같습니다.

또한 람다 유형은 철자를 사용할 수 없으므로 auto f = []...좋은 스타일입니다. 대안은std::function 중이지만 오버 헤드가 있습니다.

의 "학대"를 실제로 생각할 수 없습니다 auto. 내가 상상할 수있는 가장 가까운 것은 중요한 유형으로 명시 적으로 변환하는 것을 박탈하는 것입니다 auto.

당신이 경우 수있는 부작용을 도입하지 않고 코드에서 일부 중복을 제거, 해야한다 이렇게 좋은.

반례 (다른 사람의 답변에서 차용) :

auto i = SomeClass();
for (auto x = make_unsigned (y); ...)

여기서 우리는 타입이 무엇인지 신경 쓰므로, 우리는 작성 Someclass i;하고for(unsigned x = y;...


1
음 그렇게 쉬운 일이 아닙니다. 컴파일하고 실행하며 항목이 사소한 객체 인 경우 발자국을 직접 촬영했습니다. 반복은 모든 반복 단계에서 복사 생성자와 소멸자를 호출합니다. 범위 기반 반복자에서 자동으로 맹목적으로 사용하려는 경우 아마도 "for (auto item : some_container)"대신 "for (const auto & item : some_container)"여야합니다.
Don Hatch

2
항상 그런 것은 아니지만 참조를 원할 것입니다. 그래서 무엇? 즉 없습니다 아무것도 함께 할 수있는 auto.
spraff

나는 당신의 마지막 의견을 이해하지 못합니다. 전략이 왜 나에게 좋지 않은지, 왜 전략을 내리는 지 설명하려고했습니다.
Don Hatch

5
나는 당신이 참조를 사용하는지 여부는 자동 사용 여부와 직교한다는 것을 말하고 있습니다. 필자가 일반적으로하고 싶은 것이기 때문에 참조를 추가하기 위해 편집 할 것이지만, 현재 주제와는 전혀 관련이 없습니다.
spraff

43

해봐 auto코드 작성이 더 쉬운 곳이라면 어디에서나 사용하십시오 .

모든 언어의 모든 새로운 기능은 적어도 일부 유형의 프로그래머가 남용 할 것입니다. 경험이 풍부한 프로그래머 (누가 아님)는 숙련 된 프로그래머가 적당히 남용하여 나머지 숙련 된 프로그래머가 올바른 사용의 경계를 알게됩니다. 극단적 인 남용은 일반적으로 좋지 않지만 이러한 남용으로 인해 기능이 개선되거나 기능을 대체 할 수 있기 때문에 좋을 수 있습니다.

그러나 내가 몇 줄 이상으로 코드 작업을하고 있다면

auto foo = bla();

유형이 0으로 표시되는 경우 유형을 포함하도록 해당 줄을 변경하고 싶을 수 있습니다. 첫 번째 예는 유형이 한 번 언급되기 때문에 훌륭하며 auto지저분한 템플릿 유형을 두 번 작성하지 않아도됩니다. C ++++ 용 Hooray 그러나 가까운 라인에서 쉽게 볼 수 없다면 유형을 0으로 명시 적으로 표시하면 적어도 C ++ 및 그 후속 작업에서 긴장하게됩니다. 더 많은 추상화, 다형성 및 일반성을 가지고 높은 수준에서 작동하도록 설계된 다른 언어의 경우 괜찮습니다.


38

에서 C ++ 및 2012 년 이후물어 우리 뭐든지 패널, 거기 사용하고 사용하지 않는 경우에 대해 이야기 안드레이 Alexandrescu의 스콧 마이어스와 허브 셔터 사이의 환상적인 교환auto . 4 분 토론을 위해 25:03 분으로 건너 뜁니다. 세 스피커 모두 사용 하지 않을 때 명심해야 할 훌륭한 포인트를 제공 합니다.auto .

내가보기 엔 자신의 결론에 도달하는 사람들을 격려,하지만 내 걸릴 멀리는 것이었다 사용하는 auto모든 곳에서 하지 않는 :

  1. 가독성이 떨어집니다
  2. 자동 유형 변환 (예 : 생성자, 할당, 템플릿 중간 유형, 정수 너비 간 암시 적 변환)에 대한 우려가 있습니다.

자유 주의적 사용 explicit 하면 후자에 대한 우려가 줄어들어 전자가 문제가되는 시간을 최소화 할 수 있습니다.

Herb가 말한 것을 표현하면, "X, Y, Z를 사용하지 않는 경우을 사용하십시오 auto. X, Y 및 Z가 무엇인지 배우고 auto다른 곳에서 사용하십시오 ."


4
아마도 "거의 항상 자동" -herbsutter.com/2013/08/12/…에
Rob Starling

37

그렇습니다. 가독성을 떨어 뜨릴 수 있습니다. 정확한 유형이 길거나 말을 할 수 없거나 가독성에 중요하지 않고 변수가 짧은 상황에서 사용하는 것이 좋습니다. 예를 들어, 반복자 유형은 일반적으로 길고 중요하지 않으므로 auto작동합니다.

   for(auto i = container.begin(); i != container.end(); ++i);

auto 가독성을 손상시키지 않습니다.

또 다른 예는 길고 복잡한 파서 규칙 유형입니다. 비교:

   auto spaces = space & space & space;

r_and_t<r_and_t<r_char_t<char>&, r_char_t<char>&>, r_char_t<char>&> spaces = 
   space & space & space;

반면에 type이 알려져 있고 단순 할 때 명시 적으로 언급하면 ​​훨씬 좋습니다.

int i = foo();

오히려

auto i = foo();

2
물론 언어에서 범위 기반 for 루프를 사용하면 첫 번째 예제가 덜 흥미로워집니다. 8v)
Fred Larson

@Fred : 유형이 여전히 번거로울 수 있습니다 (연결 컨테이너를 생각하고 있습니다)
Matthieu M.

3
@Fred : 당신의 경계가없는 모든 시간 begin()end(), 또는 스텝 크기는 하나 이외의, 또는 당신이 루프로 컨테이너를 수정하는 범위 기반의 문이 도움이되지 않습니다.
Dennis Zickefoose 2016 년

6
@geotavros : 그리고 r_and_t<r_and_t<r_char_t<char>&, r_char_t<char>&>, r_char_t<char>&>합니까?
Dennis Zickefoose 2016 년

7
@geotavros : 또는 어떤 유형인지 확인 space하고 검색 하십시오 . 그것은 더 유용한 정보입니다. 결국, 문제는 "이 새로운 변수의 유형"이 아니라 "무엇을 space & space & space의미합니까?"입니다. 표현의 실제 유형은 단지 노이즈입니다.
Dennis Zickefoose 2012 년

19

auto Eigen 또는 OpenCV와 같은 선형 대수 라이브러리에서 많이 사용되는 표현식 템플릿과 함께 사용하면 매우 위험 할 수 있습니다.

auto A = Matrix(...);
auto B = Matrix(...);
auto C = A * B; // C is not a matrix. It is a matrix EXPRESSION.
cout << C; // The expression is evaluated and gives the expected result.
... // <code modifying A or B>
cout << C; // The expression is evaluated AGAIN and gives a DIFFERENT result.

이러한 유형의 실수로 인한 버그는 디버깅하기에 큰 고통입니다. 왼쪽에서 오른쪽으로 선언하는 스타일에 대해 auto를 사용하는 데 어려움이 있다면 결과를 예상되는 유형으로 명시 적으로 캐스팅하는 것이 가능합니다.

auto C = Matrix(A * B); // The expression is now evaluated immediately.

1
그것은 이상한 행동으로 시작하는 것 같습니다. 두 개의 행렬을 곱하면 연산이 게 으르더라도 다시 평가할 것으로 기대하지는 않지만 초기 평가 후에 평가 된 상태를 유지할 것으로 기대합니다. 원래 매개 변수를 수정하지 않고 매개 변수를 변경하려는 경우 식을 다시 작성하지 않아도됩니까? 또는 원래 매개 변수가 지속적으로 변경되지만 절차는 동일하게 유지되는 스트리밍 처리 상황에 맞게 설계 되었습니까?
JAB

1
A*B표현식이 auto변수 또는 다른 것으로 복사 되는지 여부에 관계없이 설명하는 동작은 여전히 ​​존재합니다.
xtofl

를 사용하여 버그가 발생 하지 않습니다 auto.
Jim Balter

@JAB : 작업 간 단순화 및 시너지 효과를 지원하도록 설계되었습니다. 예를 들어, diag(A * B)비 대각선 요소를 계산하는주기를 낭비하지 않아도됩니다.
벤 Voigt

또한 'o'는 매번 복사되는 무거운 객체 인 'for (auto o : vecContainer)'와 같은 코드를 발견했습니다. 저의 권장 사항은 원래 의도했던 것, 즉 템플릿 (어려운 추론 지침 포함)과 힘든 typedef에 사용하는 것입니다. 그럼에도 불구하고 당신은 조심해야하고 auto와 auto &를 구별해야합니다.
gast128

10

나는 autowihout 제한을 사용 하고 아무런 문제에 직면하지 않았습니다. 때로는 때로는 간단한 유형에 사용하기도합니다 int. 이것은 c ++을 나를 위해 더 높은 수준의 언어로 만들고, 파이썬 에서처럼 c ++로 변수를 선언 할 수있게합니다. 파이썬 코드를 작성한 후에는 때로는 다음과 같이 작성합니다.

auto i = MyClass();

대신에

MyClass i;

이것은 내가 그것을 남용이라고 말하는 경우입니다 auto 키워드 .

종종 나는 그 fonctionality에 더 관심이있어, 함수 이름은 일반적으로 그들이 돌아 개체에 대한 뭔가를 말하는 것처럼, 객체의 정확한 유형이 무엇인지 상관 없어 auto예에서 : 다치게하지 않습니다 auto s = mycollection.size(), 나는 그 추측 할 수 s있을 것입니다 정수의 종류이며, 정확한 유형에 관심이있는 드문 경우에는 함수 프로토 타입을 확인한 다음 코드를 작성할 때 우선 순위가 아닌 정보가 필요할 때 확인하는 것을 선호합니다. )에서와 같이 언젠가 유용 할 경우를 대비하여 int_type s = mycollection.size().

허용 된 답변 의이 예와 관련하여 :

for ( auto x = max_size; x > 0; --x )

내 코드에서는 여전히 사용합니다 auto 하고 x서명하지 않으 려면 say라고 불리는 유틸리티 함수를 사용합니다.이 함수는 make_unsigned내 우려를 분명히 나타냅니다.

for ( auto x = make_unsigned(max_size); x > 0; --x )

면책 조항 : 나는 단지 사용법을 설명 하고 조언을 할 수있는 능력이 없습니다!


1
@ChristianRau : 냉소적이지 않았습니다. 사용을 권장하지 않습니다 auto i = MyClass().
rafak 2016 년

3
후속 조치 : herbsutter.com/2013/06/13/… 참조 . 예를 들어 as_unsigned, 또는 심지어 사용하는 것이 좋습니다 auto w = widget{};.
rafak 2016 년

3

C ++ 프로그램 의 주요 문제점 중 하나 는 초기화되지 않은 변수 를 사용할 수 있다는 것입니다. 입니다. 이로 인해 비 결정적 프로그램 동작이 불쾌 해집니다. 현대의 컴파일러는 이제 프로그램 타이어가 그것을 사용한다면 적절한 / 메시지 경고 메시지를 던집니다.

이것을 설명하기 위해 아래의 C ++ 프로그램을 고려하십시오.

int main() {
    int x;
    int y = 0;
    y += x;
}

최신 컴파일러 (GCC)를 사용 하여이 프로그램을 컴파일하면 경고가 표시됩니다. 실제 복잡한 프로덕션 코드로 작업하는 경우 이러한 경고가 명확하지 않을 수 있습니다.

main.cpp : 함수 'int main ()'에서 :

main.cpp : 4 : 8 : 경고 :이 함수에서 'x'는 초기화되지 않은 상태로 사용됩니다 [-Wuninitialized]

y + = x;

    ^

===================================================== ============================== 이제 auto 를 사용하는 프로그램을 변경 하면 다음과 같이 컴파일됩니다 :

int main() {
    auto x;
    auto y = 0;
    y += x;
}

main.cpp : 함수 'int main ()'에서 :

main.cpp : 2 : 10 : 오류 : 'auto x'선언에 초기화자가 없습니다.

 auto x;

      ^

auto를 사용하면 초기화되지 않은 변수를 사용할 수 없습니다. 이것은 auto 사용을 시작하면 무료로 얻을 수있는 주요 이점입니다 .

이 개념과 다른 훌륭한 현대 C ++ 개념은 C ++ 전문가 인 Herb ShutterCppCon14 강연에서 설명합니다.

기본으로 돌아 가기 현대 C ++ 스타일의 필수 요소


2
예. 그리고 타입을 지정하기 위해 0i, 0u, 0l, 0ul, 0.0f, 0.0 또는 심지어 int (), unsigned (), double () 등으로 초기화 할 수 있습니다.
Robinson

6
이 주장은 말도 안됩니다. "컴파일러 오류가 발생하기 때문에 이니셜 라이저를 잊을 수 없다"고 말하고 있지만을 사용하는 것을 기억해야합니다 auto.
궤도에서 가벼움 경주

1
@LightnessRacesinOrbit : Herb Sutter talk 에서이 개념을 깨달았습니다. 나는 약초 대화에서 논리적 / 실용적인 조언을 찾았으므로 커뮤니티와 공유하는 것으로 생각했습니다.
Mantosh Kumar

2
나는 이것이 자동을 사용하는 좋은 동기라고 생각하지 않습니다. 초기화되지 않은 변수를 사용하려면 컴파일러의 경고 플래그를 켜고 모든 경고를 해결하십시오. 그것은 당신이 사용 해서는 안된다는 말은 아니지만auto 이 문제를 무효화하기 위해 필요하지는 않습니다.
einpoklum

2

내가 언급 한 한 가지 위험은 참고로 볼 때입니다. 예 :

MyBigObject& ref_to_big_object= big_object;
auto another_ref = ref_to_big_object; // ?

문제는 another_ref는 실제로이 경우 참조가 아니며 MyBigObject & 대신 MyBigObject입니다. 큰 개체를 인식하지 못한 채 복사합니다.

메소드에서 직접 참조를 얻는 경우 실제로 그것이 무엇인지 생각하지 못할 수 있습니다.

auto another_ref = function_returning_ref_to_big_object();

"auto &"또는 "const auto &"가 필요합니다

MyBigObject& ref_to_big_object= big_object;
auto& another_ref = ref_to_big_object;
const auto& yet_another_ref = function_returning_ref_to_big_object();

1

사용하다 auto형식이 유추 될 수있는 곳에서 . 정수라는 것을 알고 있거나 문자열이라는 것을 알고 있다면 int / std :: string 등을 사용하십시오. 어리 석음에 도달하지 않으면 언어 기능을 "과도하게 사용"하는 것에 대해 걱정하지 않아도됩니다. 또는 코드를 난독 처리합니다.

어쨌든 내 의견이다.


4
"말이되는 곳 ..."은 까다로운 부분입니다. 프로그래머는 코딩의 세부 사항에 얽매일 수 있으며, 특히 미래의 유지 관리 담당자에게 다른 프로그래머에게 의미가있는 의미를 잃게됩니다.
DarenW

그것이 언제 모호한 지 알기가 쉽다고 생각하지만 사실입니다. 확실하지 않은 경우 의견을 사용하십시오!
LainIwakura

1
타입을 사용하는 것이 이치에 맞지 않습니까?
Mikhail

일부 개발자는 유형을 항상 유추 해야한다고 말합니다 !
Arafangion

주석을 사용하십시오 ... 또는 유형을 사용하고 주석이 필요하지 않습니까?
user997112

1

auto키워드는 인수 또는 클래스 / 구조 멤버가 아닌 로컬 변수에만 사용할 수 있습니다. 따라서 원하는 곳 어디에서나 사용하는 것이 안전하고 실행 가능합니다. 나는 그들을 많이 사용합니다. 컴파일 타임에 유형이 추론되고 디버거는 디버깅하는 동안 유형을 표시하고 sizeof올바르게보고하며 decltype올바른 유형을 제공합니다. 해가 없습니다. 나는 auto남용으로 간주되지 않습니다 !


0

TL; DR : 맨 아래에있는 룰을 참조하십시오.

허용 대답은 엄지 손가락의 다음과 같은 규칙을 제안한다 :

auto첫눈에 유형을 작성하는 방법을 말하기 어려울 때마다 사용 하지만 표현식의 오른쪽 유형은 분명합니다.

그러나 나는 그것이 너무 제한적이라고 말합니다. 언젠가 나는 유형에 대해 신경 쓰지 않습니다. 성명은 시간을내어 유형을 파악하는 데 귀찮게하지 않고 충분히 유익하기 때문입니다. 그게 무슨 소리 야? 일부 답변에서 팝업 된 예를 고려하십시오.

auto x = f();

이것이 오용의 예가되는 이유는 무엇입니까 auto? f()의 반환 유형에 대한 나의 무지 입니까? 글쎄, 내가 알면 도움이 될지 모르지만 그것은 내 주요 관심사가 아닙니다. 무엇 훨씬 더 문제의 것은이다 xf()꽤 의미가 없습니다. 우리가 가진 경우 :

auto nugget = mine_gold();

대신 함수의 반환 유형이 명백한 지 여부는 일반적으로 신경 쓰지 않습니다. 진술을 읽고, 나는 내가하고있는 일을 알고 있으며 반환 값의 의미가 무엇인지 그 유형을 알 필요가 없다는 것을 알고 있습니다.

그래서 내 대답은 : auto컴파일러가 허용 할 때마다 사용하십시오 .

  • 초기화 / 지정 표현식과 함께 변수 이름이 명령문의 수행에 대한 충분한 정보를 제공하지 않는다고 생각합니다.
  • 변수 이름에 초기화 / 지정 표현식과 함께 유형이 무엇인지에 대한 "오해의 소지가있는"정보를 제공한다고 생각합니다. 즉, 자동 대신 무엇이 올지 추측해야한다면 추측 할 수 있습니다. 이 잘못된 가정은 나중에 코드에서 영향을 미칩니다.
  • 다른 유형 (예 : 참조)을 적용하려고합니다.

그리고 또한:

  • auto구체적인 유형으로 바꾸기 전에 의미있는 이름 (물론 유형 이름이 포함되지 않음)을 제공하는 것이 좋습니다.

-3

내 쓰라린 경험 중 하나 auto입니다 람다 표현식을 사용하여 :

auto i = []() { return 0; };
cout<<"i = "<<i<<endl; // output: 1 !!!

실제로, 여기서는의 i함수 포인터로 해석됩니다 int(*)(). 이것은 간단 cout하지만, 어떤 종류의 컴파일 / 런타임 오류가 발생했는지 상상해보십시오 template.

당신은해야 하지 않도록 auto 같은 표현식과 적절한 넣어 return유형 (또는 제어 decltype())

위 예제의 올바른 사용법은 다음과 같습니다.

auto i = []() { return 0; }(); // and now i contains the result of calling the lambda  

7
당신은 자동차와 관련이있는 것을 설명하는 끔찍한 일을했습니다. 함수를 생성 한 다음 인쇄했습니다 ... 좋아요?
Dennis Zickefoose 5

5
@iammilind : 그리고 그것은 auto와 어떤 관계가 있습니까?
R. Martinho Fernandes

7
나는 ()결국에는 끝내고 싶지 않을 것 입니다. 람다는 함수 역할을하기 위해 존재하며, 함수 포인터 변환이 시작됩니다. 바로 호출하려면 왜 람다를 사용합니까? auto i = 0;오히려 잘 작동합니다.
R. Martinho Fernandes 5

4
적어도 람다가없는 동일한 것 auto x = []() { /* .... whatever goes in here ... */ }()보다 나은 시나리오를 설명 할 수 있습니까 auto x = /* .... whatever goes in here ... */;? 나는 같은 이유로 무의미하다는 것을 알았습니다 auto x = 42 + y - 42.
R. Martinho Fernandes

6
-1 이것은 자동 결함이 아닙니다. 람다의 유형은 철자가 될 수 없으므로 자동이 필요 합니다. 함수 를 호출 하는 것을 잊어 버린 경우 자신의 경계입니다! 호출되지 않은 함수 포인터를 C printf에 가능한 한 넣을 수 있습니다.
spraff
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.