2017-05-03 2 views
1

Guten Tag! Bitte helfen Sie mir für meinen Code, ich versuche zu constexpr Klasse mit const Zeiger auf nicht-konstant und verändern sich nicht konstante Variable in Zukunft meine compilator sagtC++ konstanter Zeiger in der constexpr Klasse

"error: ‘Actuator{const Pin{1ul, 1ul}, const Pin{1ul, 2ul}, const Pin{1ul, 3ul}, ((velocity_type*)(& velocity))}’ is not a constant expression",

Objekt act1 immer das Leben, weil sein Code zu machen für ARM Embedded-Gerät

Code:

#include <cstddef> 

typedef std::size_t port_type; 
typedef std::size_t pin_type; 
typedef std::size_t velocity_type; 

class Pin { 
private: 
    port_type const _port; 
    pin_type const _pin; 

public: 
    constexpr Pin(port_type const port, pin_type const pin) : 
      _port { port }, _pin { pin } { 
    } 
}; 

class Actuator { 
private: 
    Pin const _enable_pin; 
    Pin const _dir_pin; 
    Pin const _step_pin; 
    velocity_type* const _velocity; //constant pointer to non-constant variable 

public: 
    constexpr Actuator(Pin const ep, Pin const dp, Pin const sp, const velocity_type velocity) : 
      _enable_pin { ep }, _dir_pin { dp }, _step_pin { sp }, _velocity(const_cast<velocity_type*>(&velocity)) { 
    } 
    void set_velocity(const velocity_type velocity) const {*_velocity = velocity;} //try to change velocity 
}; 

int main() { 
    constexpr Actuator act1 (Pin { 1, 1 }, Pin { 1, 2 }, Pin { 1, 3 }, 1u); 
    act1.set_velocity(1u); 
} 
+3

Selbst wenn Ihr Compiler den Wert der Zeiger zeigt t mehr ändern o würde so tun sowieso _undefined behavior_ (weil es einen baumelnden Zeiger auf den Wert enthält, die nicht mehr existiert). –

+0

meine Vermutung ist, dass die Aussage als Fehler markiert nicht die erforderliche Kompilierung Auswertung nicht erfüllt. Werfen Sie einen Blick auf diese: http: //en.cppreference.com/w/cpp/language/constexpr –

Antwort

1

nach C++ Standard [expr-const]/2 (Hervorhebung von mir)

Ein Ausdruck e ist ein Kern konstanter Ausdruck es sei denn die Bewertung der e, die Regeln der abstrakten Maschine folgen, würden die folgenden Ausdrücke eines bewerten:
(...)
15. ein reinterpret_cast

((velocity_type*)(& velocity)) ist auf jeden Fall eine Form von reinterpret Gießen so kann es nicht in konstanten Ausdruck verwendet werden ...

Verwandte Themen