Const und der ternäre Operator



  • Hallo,

    folgendes Problem: ich möchte eine Konstanten mit dem ternären Operator abhängig vom Wert einer anderen Variableinitialisieren. Das funktioniert natürlich nicht, wenn der Rückgabewert des Operators nicht bekannt ist. Die erste Frage wäre: warum funktioniert das nicht, auch wenn das Vergleichsergebnis bekannt ist?

    //...
    	isUNC_Address = false;
    	const unsigned long size = (isUNC_Address ? 32767 : MAX_PATH);
    	TCHAR systemFileName[size] = { "\0" };
    

    Das sieht ein bisschen nach WinAPI aus (was auch der Grund ist, warum ich raw arrays brauche), aber die Frage passt besser in dieses Forum. Der Kontext ist diesem Fall nicht so wichtig, ich möchte einfach nur wissen, warum das nicht geht? Ich meine, rein theoretisch erfüllt die Zuweisung die Bedingung, dass der zuzuweisende Wert konstant und zur Compilierzeit bekannt ist (in diesem Fall die Werte).

    Ich habe mich umso mehr gewundert, dass der Compiler den Fehler nicht erkannt hat, sobald ich das Ganze in ein Template verpackt habe:

    template <class U>
    void setupDevContext(U dev, std::string& layout, bool isUNC_Address)
    {
    	const unsigned long size = (isUNC_Address ? 32767 : MAX_PATH);
    	TCHAR serialNumber[size] = { "\0" };
    	//...
    }
    

    Woran liegt das?



  • Array-Grössen müssen konstante Ausdrücke, d.h. zur Kompilierzeit bekannte Konstanten sein. Der Wert von size hängt aber von der Variablen isUNC_Address ab, welche keinen konstanten Ausdruck darstellt. Indirekt ist size deshalb ebenfalls kein konstanter Ausdruck.

    Der zweite Fall "funktioniert" wahrscheinlich nur, weil das Template nicht instanziiert und dessen Code daher nicht vollständig kompiliert wurde.


Log in to reply