2017-05-03 36 views
1

美好的一天!请帮我为我的代码,我尽量让constexpr类常量指针在今后的非恒定和变化不恒定的变量,我compilator说C++在constexpr类中的常量指针

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

对象ACT1总是生活,因为它的代码对于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

即使让你的编译器来改变指针指向T的值o,这样做将会是_undefined behavior_(因为它包含一个指向不存在的值的悬挂指针)。 –

+0

我的猜测是,标记为错误的语句不符合所需的编译时间评估。看看这个:http://en.cppreference.com/w/cpp/language/constexpr –

回答

1

根据C++标准[expr-const]/2(重点煤矿)

表达式e是一个核心常量表达式除非 e的评价,如下所述抽象机的规则,将评估的 一个下面的表达式:
(...)
15.一个reinterpret_cast的

((velocity_type*)(& velocity))绝对是重新解释铸造,因此它不能在常量表达式中使用的一种形式......