2017-12-14 4 views
7

값합니다 (-std=c++17 -Wall -Wextra -Werror -pedantic-errors -O0 컴파일 플래그) 코드 compiles successfully both with clang++ 5.0.0 and g++ 7.2 다음불완전한 유형

struct Foo; 

struct Bar 
{ 
    Foo get() const; 

    void set(Foo); 
}; 

struct Foo 
{ 
}; 

Foo Bar::get() const 
{ 
    return {}; 
} 

void Bar::set(Foo) 
{ 
} 


int main() 
{ 
    Bar bar{}; 

    (void)bar.get(); 
    bar.set(Foo{}); 
} 

는 함수 매개 변수로 불완전한 유형을 사용하고 값을 반환하는 유효한가요? C++이 뭐라고 말합니까? 함수에서

+0

이것은 기본적으로 당신이 모든 헤더에서 무엇을하는지입니다 ... –

+0

@ Jaa-c 바보 같이 들릴지 모르지만 필자는 이전에 헤더 파일에서 함수 리턴 유형 또는 매개 변수 유형으로 불완전한 유형을 사용한 적이 없습니다. – Constructor

+0

아이디어는 정의를 필요로하는 함수를 사용하지 않을 수도 있기 때문에 간접적으로 헤더를 포함하는 모든 사람들이 사용하는 모든 유형의 전체 정의를 구문 분석해야한다는 것을 의미하지는 않습니다. 그리고 그들이 * do *한다면, 그들은 완전한 정의 자체를 포함 할 수 있습니다. 나는 논쟁이 격렬하게 불타 오르며 영원히 사용자의 기대를 반 기지 않는지 여부를 생각한다. 내부적으로 사용되는 헤더의 경우, 이는 당연한 말입니다. –

답변

8

정의, 당신은 불완전한 유형 사용할 수 없습니다 불완전한 (아마도 이력서 restrict로지지 않습니다

매개 변수 또는 함수 정의에 대한 반환 형식의 유형 : [dcl.fct]/12를) 클래스 형식을 함수 정의 컨텍스트에서 삭제해야합니다.

하지만 함수 선언은 그러한 제한이 없다. 당신이 Bar::getBar::set을 정의 할 때, Foo은 완전한 타입이므로, 프로그램은 괜찮습니다.

3

함수 매개 변수와 반환 값으로 불완전한 유형을 사용하는 것이 유효합니까? C++이 뭐라고 말합니까?

함수 선언에서 유효합니다.

[basic.def.odr]은 유형을 완료해야하는 상황을 나열합니다. 이 목록에는 함수 선언에 대한 언급이 없습니다. 함수 정의에는 T의 인수 및 반환 유형에 대해 T에 대한 정의가 필요합니다.

+0

헤더에 반환 유형 'T'를 정의하지 않는 것이 왜 문제가됩니까? 호출자는'#include '를 추가하기 만하면됩니다. 그리고 매우 작은 불편 함 때문에 모든 사람들을위한 컴파일 타임 의존성을 줄일 수 있습니다. 왜냐하면'fun.h'를 필요로하는 모든 사람들이 실제로 함수를 호출 할 수 없기 때문입니다. 우리는 멤버 함수에 대해 이야기하고 있습니다. –

+0

@ChristianHackl 그래, 그게 내 바보 야. – user2079303

0

지금까지 내가 아는 한, 당신은 다음과 같은 방법으로 불완전한 유형 사용할 수 있습니다 포인터로

  1. 을;
  2. 참조;

함수의 선언은 어떤 개체도 만들지 않으므로 합법적입니다.

관련 문제