문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 C++/문법 (문단 편집) ==== 템플릿 인자 추론 ==== {{{#!syntax cpp import ; import ; template void increment1(T x) { ++x; } void increment2(auto x) { ++x; // 전위 증가 연산자를 사용할 수 없으면 예외 발생 } template void increment3(T lhs, T rhs) { lhs += rhs; } template void increment4(T lhs, const T* rhs) { lhs += *rhs; } void increment5(auto lhs, auto rhs) { lhs += rhs; } int main() { int a = 100; long long b = 500; const int c = 900; int& d = a; increment1(a); // 아무것도 안 함 (1) increment1(510942633); // (2) increment1(b); // (3) increment1(d); // (4) d는 a의 참조 변수이지만 &가 부패해서 사라진다 increment1('B'); // (5) increment1("namu"); // 오류! 문자열은 더할 수 없습니다 increment2(a); // (4) increment2(a + b); // (5) 값에 의한 전달은 prvalue도 전달할 수 있다 increment2('B'); // (6) increment2("wiki"); // 오류! 문자열은 더할 수 없습니다 increment3(a, 1058142); // (7) increment3(a, c); // (8) 인자의 const는 매개변수의 auto에 영향을 끼치지 못한다 increment3(a, b); // 오류! 전달된 두 매개변수 T의 자료형이 서로 다릅니다 increment4(a, &c); // (9) 포인터(주소)는 glvalue만이 가질 수 있다. glvalue는 lvalue라서 모든 한정자를 반드시 유지한다 increment4(a, &b); // 오류! 전달된 두 매개변수 T의 자료형이 서로 다릅니다 increment4(a, &d); // 오류! 포인터와 인자의 const 한정자가 일치하지 않습니다 increment5(a, b); // (10) increment5(d, c); // (11) d는 참조형이지만 auto에서 &가 부패해서 사라진다 increment5(c, d); // (12) increment5(d, b); // (13) increment5(std::string{ "Namu" }, std::string{ "Wiki" }); // (14) std::println("a의 값: {}", a) // 100 std::println("b의 값: {}", b) // 500 std::println("c의 값: {}", c) // 900 std::println("d의 값: {}", d) // 100 (a의 참조형) return 0; } }}}'''Template Argument Deduction''' 여기서 {{{increment1}}} 함수와 {{{increment2}}} 함수는 서로 같은 의미를 가진다. 이게 중요한 이유는 바로 템플릿과 {{{auto}}}는 본질적으로 같은 뜻이라는 걸 내포하기 때문이다. 함수의 매개변수에 사용되는 {{{auto}}}는 바로 곧 템플릿이며, 각각이 다른 자료형으로 추론되는 템플릿일 뿐이다. 그렇기에 {{{auto}}}나 템플릿이나 원래의 한정자가 부패하는 것이다. 이렇게 해야 함수 내부의 값과 외부의 값을 분리하고 의도치 않은 동작을 막을 수 있다. C++에서 의도하지 않은 동작은 모두 일어나서는 안되는 일이다. 사용자가 직접 {{{&}}}, {{{const&}}}, {{{&&}}} {{{*}}} 따위의 한정자를 지정하지 않으면 컴파일러는 무조건 값에 의한 전달을 수행한다. 이를 막으려면 자료형 문서에서 설명한 것 처럼 {{{T&&}}} 또는 {{{auto&&}}}로 완벽한 자료형을 얻어야 한다. 이를 함수에서 사용하는 방법은 다음 단락에서 설명한다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기