2016-07-27 29 views
1

Ich versuche, einige vorhandenen Code zu machen constexpr, aber immer NachrichtZeichenkette erklärt statisch in constexpr Funktion

Fehler: 'my_string' erklärt 'static' in 'constexpr' Funktion

stark vereinfacht, die Code:

template <typename T> 
constexpr 
int foo(const int x) 
{ 
    static // error: 'my_string' declared 'static' in 'constexpr' function 
    constexpr char my_string[] = "my foo error message!"; 
    if (x == 0) 
    { 
    std::cout << my_string << std::endl; 
    } 
    return x; 
} 

class boo 
{ 
public: 
    constexpr boo() 
    { 
    static // error: 'constructor_string' declared 'static' in 'constexpr' function 
    constexpr char constructor_string[] = "my constructor error message."; 
    } 
}; 

die Saiten werden an anderer Stelle natürlich verwendet, und ich möchte, um sicherzustellen, dass sie nie dupliziert werden (so statisch) (und ich mag die Verwendung von statischen Gründen der Kompatibilität mit C + halten +03, wo der consExpr nicht verfügbar ist, indem BOOST_CONSTEXPR_OR_CONST verwendet).

+0

Müssen Sie Array anstelle von C-String-Zeiger haben? Nicht 'const char * my_string; 'genug? – Jarod42

+1

BTW, 'std :: cout <<' ist nicht "constexpr". – Jarod42

+0

Setzen Sie die Variable in einen anonymen Namespace außerhalb der Funktion und verwenden Sie die BOOST_CONSTEXPR_OR_CONST cv darauf. – kfsone

Antwort

1

Sie können in constexpr-Funktionen derzeit keine statischen Variablen haben. Es gibt einen Vorschlag, diese Anforderung zu lockern, wenn die Variable mit einem Kompilierungszeitausdruck initialisiert wird.

Da Sie einem String-Literal zuweisen, würde ich empfehlen, nur die 'statische' fallenlassen und vorausgesetzt, der Compiler macht es so optimal wie möglich (was es in der Praxis tun sollte). Eine andere Option wäre, die Zeichenfolge als static constexpr als ein privates Klassenmitglied oder im Namensraumbereich zu machen.

+0

Das bestätigt meinen Verdacht, dass dies eine unnötige lästige Einschränkung ist. Für eine einmalige Verwendung sind die Vorschläge triviale Änderungen, aber dies gilt für Dutzende von Funktionen und Distributionen, so dass jede Änderung unordentlich ist. Es gibt andere Hindernisse, um es constexpr, so dass ich auf eine Entspannung in C++ neuesten warten werde. –