2017-05-03 19 views
1

おはよう! 、常に人生constexprクラスのC++定数ポインタ

オブジェクトACT1、私のcompilatorは

"error: ‘Actuator{const Pin{1ul, 1ul}, const Pin{1ul, 2ul}, const Pin{1ul, 3ul}, ((velocity_type*)(& velocity))}’ is not a constant expression"言い、私は非定数へのconstポインタでconstexprのクラスを作成し、将来的に非定数の変数を変更しようと、私のコードのために私を助けてそのコードなぜならくださいARM組み込み機器用

コード:

#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

あなたのコンパイラは、ポインタがトン指摘値を変更することが許可されている場合でもそれを行うと、とにかく(それはもはや存在しない値へのぶら下がりのポインタを含んでいるので)_undefined behavior_となります。 –

+0

私の推測では、エラーとしてフラグが立てられた文は、必要なコンパイル時間の評価を満たさないということです。これを見てください:http://en.cppreference.com/w/cpp/language/constexpr –

答えて

1

C++標準[expr-const]/2(強調鉱山)

によります
(...)
15:

式eは Eの評価は、抽象機械のルールを以下、 の1以下の式を評価しますない限り、コア定数式ですreinterpret_castは

((velocity_type*)(& velocity))は...確かに再解釈ので、鋳造、それは定数式で使用することができないの形である

関連する問題