Namespaces
Variants

return statement

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
goto - return
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

현재 함수를 종료하고 지정된 값(있는 경우)을 호출자에게 반환합니다.

목차

구문

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

설명

1) 표현식 을 평가하고, 현재 함수를 종료하며 표현식 의 결과를 암시적 변환 을 통해 함수 반환 타입으로 변환한 후 호출자에게 반환합니다. 반환 타입이 (cv 한정자가 있을 수 있는) void 인 함수에서는 표현식 이 선택사항이며, 생성자와 소멸자에서는 허용되지 않습니다.
2) 함수의 반환값을 생성하기 위해 copy-list-initialization 을 사용합니다.
3,4) 코루틴에서는 최종 일시 중단 지점에 대해 co_return 키워드를 return 대신 사용해야 합니다 (자세한 내용은 coroutines 참조).

표현식 또는 중괄호 초기화 목록 (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부터)
  • 또는 비휘발성 객체 타입에 대한 rvalue 참조인 경우
(C++20부터)

그리고 그 변수가 가장 안쪽에 둘러싸인 함수나 람다 표현식의

  • 본문 내에서 선언되었거나
  • 매개변수로 선언된 경우

(C++11부터)

표현식 이 이동 가능한 경우, 반환된 값을 초기화하는 데 사용할 생성자를 선택하기 위한 오버로드 해결 두 번 수행됩니다: 또는 co_return 의 경우, promise. return_value ( ) 의 오버로드를 선택하기 위해 (C++20부터)

  • 먼저 표현식 이 rvalue 표현식인 것처럼 수행되며 (따라서 이동 생성자 를 선택할 수 있습니다), 그리고
  • 첫 번째 오버로드 해결이 실패한 경우
(C++11부터)
(C++23까지)
  • 또는 성공했지만 이동 생성자 를 선택하지 않은 경우 (공식적으로, 선택된 생성자의 첫 번째 매개변수가 표현식 의 (가능한 cv-qualified) 타입에 대한 rvalue 참조가 아닌 경우)
(C++11부터)
(C++20까지)
  • 그런 다음 오버로드 해결이 일반적으로 수행되며, 표현식 을 lvalue로 간주합니다 (따라서 복사 생성자 를 선택할 수 있습니다).
(C++11부터)
(C++23까지)

표현식 이 이동 가능한 경우, xvalue로 처리됩니다 (따라서 오버로드 해결이 이동 생성자 를 선택할 수 있습니다).

(C++23부터)

보장된 복사 생략

표현식 이 prvalue인 경우, 결과 객체는 해당 표현식에 의해 직접 초기화됩니다. 이는 타입이 일치할 때 복사나 이동 생성자를 포함하지 않습니다 ( 복사 생략 참조).

(C++17부터)
기능 테스트 매크로 표준 기능
__cpp_implicit_move 202207L (C++23) 단순화된 암시적 이동

키워드

return , co_return

예제

#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