return
statement
현재 함수를 종료하고 지정된 값(있는 경우)을 호출자에게 반환합니다.
목차 |
구문
attr
(선택 사항)
return
expression
(선택 사항)
;
|
(1) | ||||||||
attr
(선택 사항)
return
braced-init-list
;
|
(2) | (C++11부터) | |||||||
attr
(선택 사항)
co_return
expression
(선택 사항)
;
|
(3) | (C++20부터) | |||||||
attr
(선택 사항)
co_return
braced-init-list
;
|
(4) | (C++20부터) | |||||||
| attr | - | (since C++11) 임의 개수의 attributes 시퀀스 |
| expression | - | expression , 함수 반환 타입으로 변환 가능한 |
| braced-init-list | - | brace-enclosed initializer list |
설명
표현식 또는 중괄호 초기화 목록 (C++11부터) (존재하는 경우)은 피연산자 로 알려져 있으며, return 문의 일부입니다.
|
함수 호출 결과의 복사 초기화와 expression 끝에서 모든 임시 객체의 소멸 사이에 시퀀스 포인트 가 존재합니다. |
(until C++11) |
|
함수 호출 결과의 복사 초기화는 expression 끝에서 모든 임시 객체의 소멸보다 sequenced-before 관계에 있으며, 이는 다시 return 문을 포함하는 블록의 지역 변수 소멸보다 sequenced-before 관계에 있습니다. |
(since C++11) |
|
함수의 반환 타입이 참조 타입이고 return 문 (1,2) 이 반환된 참조를 temporary expression 의 결과에 바인딩하는 경우, 프로그램은 ill-formed입니다. |
(since C++26) |
제어가 끝에 도달하면
- 반환형이 (cv 한정자가 있을 수 있는) void 인 함수,
- 생성자,
- 소멸자, 또는
- 반환형이 (cv 한정자가 있을 수 있는) void 인 함수의 함수 try 블록
return 문을 만나지 않고 종료될 경우, return ; 가 실행됩니다.
제어가
main
함수
의 끝에 도달하면,
return
0
;
가 실행됩니다.
값을 반환하는 함수의 끝을 흐름으로 빠져나가는 것은,
main
함수
및 특정
coroutines
(C++20부터)
를 제외하고,
return
문 없이는 정의되지 않은 동작입니다.
(cv 한정자가 있을 수 있는) void 를 반환하는 함수에서, return 문과 expression 을 사용할 수 있습니다. 단, 표현식의 타입이 (cv 한정자가 있을 수 있는) void 인 경우에만 가능합니다.
|
함수의 반환 타입이 플레이스홀더 타입 으로 지정된 경우, 반환 값으로부터 추론 됩니다. 만약 decltype ( auto ) 가 사용되면, 타입 추론은 엔티티 가 될 수 있는 표현식 을 엔티티 로 취급합니다. |
(C++14부터) |
참고 사항
값으로 반환하는 것은 copy elision 이 사용되지 않는 한, 임시 객체의 생성과 복사/이동을 수반할 수 있습니다. 구체적으로, 복사/이동에 대한 조건은 다음과 같습니다:
로컬 변수와 매개변수로부터의 자동 이동표현식 은 다음과 같은 경우 이동 가능(move-eligible) 입니다: 자동 저장 기간을 가지는 변수의 이름인 (괄호로 둘러싸일 수 있는) 식별자 표현식 이며, 그 변수의 타입이
|
(C++11부터) |
|
(C++20부터) |
|
그리고 그 변수가 가장 안쪽에 둘러싸인 함수나 람다 표현식의
|
(C++11부터) |
|
표현식 이 이동 가능한 경우, 반환된 값을 초기화하는 데 사용할 생성자를 선택하기 위한 오버로드 해결 이 두 번 수행됩니다: 또는 co_return 의 경우, promise. return_value ( ) 의 오버로드를 선택하기 위해 (C++20부터)
|
(C++11부터)
(C++23까지) |
|
(C++11부터)
(C++20까지) |
|
(C++11부터)
(C++23까지) |
|
표현식 이 이동 가능한 경우, xvalue로 처리됩니다 (따라서 오버로드 해결이 이동 생성자 를 선택할 수 있습니다). |
(C++23부터) |
보장된 복사 생략표현식 이 prvalue인 경우, 결과 객체는 해당 표현식에 의해 직접 초기화됩니다. 이는 타입이 일치할 때 복사나 이동 생성자를 포함하지 않습니다 ( 복사 생략 참조). |
(C++17부터) |
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_implicit_move
|
202207L
|
(C++23) | 단순화된 암시적 이동 |
키워드
예제
#include <iostream> #include <string> #include <utility> void fa(int i) { if (i == 2) return; std::cout << "fa("<< i << ")\n"; } // 암시적 반환; int fb(int i) { if (i > 4) return 4; std::cout << "fb(" << i << ")\n"; return 2; } std::pair<std::string, int> fc(const char* p, int x) { return {p, x}; } void fd() { return fa(10); // fa(10)은 void 표현식입니다 } int main() { fa(1); // 인수를 출력한 후 반환합니다 fa(2); // i == 2일 때 아무 작업도 하지 않고 반환합니다 int i = fb(5); // 4를 반환합니다 i = fb(i); // 인수를 출력하고 2를 반환합니다 std::cout << "i = " << i << '\n' << "fc(~).second = " << fc("Hello", 7).second << '\n'; fd(); } struct MoveOnly { MoveOnly() = default; MoveOnly(MoveOnly&&) = default; }; MoveOnly move_11(MoveOnly arg) { return arg; // OK. 암시적 이동 } MoveOnly move_11(MoveOnly&& arg) { return arg; // C++20부터 OK. 암시적 이동 } MoveOnly&& move_23(MoveOnly&& arg) { return arg; // C++23부터 OK. 암시적 이동 }
출력:
fa(1) fb(4) i = 2 fc(~).second = 7 fa(10)
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| CWG 1541 | C++98 | expression 이 반환 타입이 cv-qualified void 인 경우 생략할 수 없었음 | 생략 가능함 |
| CWG 1579 | C++11 | 변환 이동 생성자에 의한 반환이 허용되지 않았음 |
변환 이동
생성자 탐색이 활성화됨 |
| CWG 1885 | C++98 | 자동 변수의 소멸 순서가 명시적이지 않았음 | 순서 규칙이 추가됨 |
참고 항목
|
C 문서
for
return
문
|