2014-06-10 27 views
8

Zastanawiam się, czy istnieją jakiekolwiek ograniczenia dotyczące tego, gdzie funkcje i metody constexpr muszą być zadeklarowane, tak jak istnieją funkcje i metody inline.Zgłaszanie funkcji lub metod constexpr

Wiem, że wbudowane funkcje lub metody muszą być zapisane w plikach nagłówkowych, aby dać kompilatorowi dostęp do ich definicji, gdzie są wywoływane. miałoby sens, jeśli było coś podobnego do constexpr, ale nie uda się znaleźć coś w tej kwestii ...

Więc w zasadzie moje pytania są następujące:

  • mogę napisać definicje constexpr działa w pliku nagłówkowym bez ryzyka duplikowania symbolu?

  • Czy mogę oddzielić deklarację od definicji funkcji lub metod constexpr?

+0

Może to być powiązane z http: // stackoverflow.com/questions/4748083/when-should-you-use-constexpr-capability-in-c11 – alediaferia

+7

[dcl.constexpr]/2 Funkcje 'constexpr' i konstruktory' constexpr' są niejawnie 'inline', co sugeruje, że * potrzebujesz * definicji w każdej jednostce tłumaczeniowej (pliku źródłowym), w której funkcja jest używana, i możesz mieć wiele definicji w różnych plikach źródłowych pod warunkiem, że są one równoważne (zobacz ODR). – dyp

+0

Powiązane: http://stackoverflow.com/questions/14391272/does-constexpr-imply-inline – dyp

Odpowiedz

3

Miejsce zdefiniowania funkcji constexpr wpływa na sposób jej wykorzystania. W szczególności:

C++ 14 [expr.const] P2

Warunkowe ekspresji e jest rdzeń stałej ekspresji ile oceny e, zgodnie z zasadami abstrakcyjnego urządzenia (1.9) , by ocenić jedno z następujących wyrażeń:

  • ...
  • inwokacji nieokreślonej constexpr funkcji lub nieokreślonej constexpr konstruktora;

Nie można więc używać constexpr funkcję w stałej ekspresji (szablon argument constexpr zmienną inicjator, zmienna globalna inicjująca, która musi być oceniana statycznie, array związany wyrażenie, może inni), jeśli to było tylko zadeklarowany, ale jeszcze nie zdefiniowany.

Podobnie, DYP komentuje

C++ 14 [dcl.constexpr] P2

... constexpr funkcje i constexpr konstruktorzy pośrednio inline (7.1.2).

To sugeruje odpowiedź na pierwsze pytanie: zdefiniowanie funkcji constexpr w nagłówku nie spowoduje powielenia symboli. Oznacza to również, że jeśli zadeklarujesz funkcję constexpr w nagłówku, a następnie wywołasz ją w jednostce tłumaczeniowej, nawet tylko w środowisku wykonawczym, "Funkcja inline zostanie zdefiniowana w każdej jednostce tłumaczeniowej, w której jest używana odr." z C++ 14 [basic.def.odr] p4.

Należy zauważyć, że przepisy dotyczące stałych wyrażeń i połączeń w ogóle są różne: rozmowy w ogóle wymagają definicji być gdzieś w jednostce tłumaczeniowej: stałe wyrażenia wymagają definicji być przed stałej ekspresji.

Powiązane problemy