2016-12-07 8 views
-1

Können Sie sagen, wie kann ich Assertion, ist Funktion noexcept (ohne Argument übergeben)? Vielen Dank.Nein - außer ohne Argument übergeben

+0

Im Allgemeinen können Sie keine Funktion ohne Angabe von Argumenten angeben - es kann mehrere Überladungen mit demselben Namen, einige "noexcept" und andere nicht geben. –

Antwort

0

Angenommen, Sie fragen:

Wie kann ich behaupten, dass eine Funktion ist noexcept ohne es zu nennen?

Die Antwort ist, dass Sie nicht können, weil der noexcept Spezifizierer zwischen den Überladungen unterschiedlich sein könnte. Beispiel:

int a(int) noexcept; 
int a(int, int); 

// What would `noexcept(a)` mean? 
+0

#include #include Lücke ff() noexcept { } Klasse A { public: Hohlraum f() noexcept { ff(); } }; void g (A * obj, leer (A :: * f)()) { static_assert (noexcept ((obj -> * f)), "kl"); } int main() { A a; g (& a, &A::f); } –

+0

Zum Beispiel denke ich, dass diese falschen Wert zurück #include #include Leere ff() noexcept { } Klasse A { public: Leere f() noexcept { ff(); } }; Lücke g (A * obj, void (* A :: f)()) { static_assert (noexcept ((obj -> * f)), "kl"); } int main() { A a; g (& a, &A::f); } Warum behauptet wird? –

+0

Können Sie bitte posten, dass auf wandbox oder etwas ähnliches –

5

Angenommen, Sie (dank @VittorioRomeo für die Annahme) fragen:

Wie kann ich behaupten, dass eine Funktion ohne nannte es noexcept ist?

Sie können den Operator noexcept verwenden, da seine Operanden nicht bewertete Operanden sind.
Mit anderen Worten: Sie können dies tun:

void f(int) noexcept { } 
void f(int, int) { } 

int main() { 
    static_assert(noexcept(f(0)), "!"); 
    static_assert(not noexcept(f(0, 0)), "!"); 
} 

f nicht in jedem Fall aufgerufen wird, das heißt die (lassen Sie mich sagen) Natur eines unevaluierten Operanden.

Der interessanteste Teil ist, dass Sie es mit std::declval kombinieren können, wenn Sie keine Variable haben, um als ein Argument verwendet zu werden, und Sie nicht wissen, wie man es konstruiert.
Als Beispiel:

#include<utility> 

struct S { S(int) {} }; 

void f(S) noexcept { } 

int main() { 
    static_assert(noexcept(f(std::declval<S>())), "!"); 
} 

Bitte beachte, dass ich muss S nichts passieren zu bauen, auch wenn es keinen Default-Konstruktor hat.

Dies ist in der Regel genug, um die Anforderung von zu umgehen keine Argumente übergeben.