2017-12-14 84 views
7

następujący kod compiles successfully both with clang++ 5.0.0 and g++ 7.2 (z flagami -std=c++17 -Wall -Wextra -Werror -pedantic-errors -O0 kompilacji):Niekompletne typy jak parametry funkcji i zwracane wartości

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{}); 
} 

Czy to ważne, aby korzystać z niepełnych typów jako parametrów funkcji i zwracane wartości? Co mówi na tym C++?

+0

Zasadniczo to, co robisz w dowolnym nagłówku ... –

+0

@ Jaa-c Może to zabrzmieć głupio, ale nigdy wcześniej nie używałam niekompletnych typów jako typów zwrotów funkcji lub typów parametrów w moich plikach nagłówkowych. – Constructor

+0

Chodzi o to, aby nie tworzyć wszystkich, którzy, prawdopodobnie pośrednio, zawierają twój nagłówek * również * muszą analizować pełne definicje wszystkich typów używanych przez niego, ponieważ mogą nie używać funkcji, które wymagają tych definicji. A jeśli * robią *, to mogą same zawrzeć pełną definicję. Wydaje mi się, że debata szaleje w nieskończoność, czy dobrze jest oczekiwać od użytkowników. W przypadku nagłówków używanych wewnętrznie, powiedziałbym, że to nie myślenia. –

Odpowiedz

8

W zależności definicja, nie można używać niekompletnych typy: [dcl.fct]/12:

typ parametru lub typu zamian za definicji funkcji nie będzie niekompletny (ewentualnie cv -qualified) typ klasy w kontekście definicji funkcji, chyba że funkcja zostanie usunięta.

Ale funkcja deklaracja nie ma takich ograniczeń. Do czasu zdefiniowania Bar::get i , Foo jest kompletny typ, więc program jest w porządku.

3

Czy można używać niekompletnych typów jako parametrów funkcji i wartości zwracanych? Co mówi na tym C++?

W deklaracji funkcji tak jest poprawna.

[basic.def.odr] zawiera listę sytuacji, w których typ musi być kompletny. Na tej liście nie ma wzmianki o deklaracjach funkcji. Zauważ, że definicje funkcji wymagają definicji dla T dla argumentów i typów zwracanych T.

+0

Dlaczego problematyczne jest nie definiowanie typu zwrotu "T" w nagłówku? Wywołujący musi dodać do niego '# include', a w zamian za bardzo małą niedogodność redukuje zależności w czasie kompilacji dla wszystkich innych, ponieważ nie każdy, kto potrzebuje' fun.h' może faktycznie wywołać funkcję, szczególnie jeśli mówimy o funkcji członka. –

+0

@ChristianHackl yeah, to było trochę głupie ze mnie. – user2079303

0

O ile wiem, można użyć niekompletną typu w jeden z następujących sposobów:

  1. jako wskaźniki;
  2. Jako odniesienie;

Ponieważ deklaracja funkcji nie tworzy żadnego obiektu, więc jest legalna.

Powiązane problemy