C++ c++;constexpr类中的常量指针

C++ c++;constexpr类中的常量指针,c++,pointers,reference,constexpr,C++,Pointers,Reference,Constexpr,你好!我的编译器说:“请帮助我编写代码,我试图用const指针创建一个指向非常量的constexpr类,并在将来更改非常量变量。” “错误:'执行器{const Pin{1ul,1ul},const Pin{1ul,2ul},const Pin{1ul,3ul},((速度类型*)(&velocity))}不是常量表达式” 对象act1始终是生命体,因为它的代码用于ARM嵌入式设备 代码: #包括 typedef std::size\u t port\u type; typedef std::尺寸

你好!我的编译器说:“请帮助我编写代码,我试图用const指针创建一个指向非常量的constexpr类,并在将来更改非常量变量。”

“错误:'执行器{const Pin{1ul,1ul},const Pin{1ul,2ul},const Pin{1ul,3ul},((速度类型*)(&velocity))}不是常量表达式”

对象act1始终是生命体,因为它的代码用于ARM嵌入式设备

代码:

#包括
typedef std::size\u t port\u type;
typedef std::尺寸针型;
typedef std::size\u t velocity\u type;
类别针{
私人:
端口类型常量端口;
引脚类型常数引脚;
公众:
constexpr引脚(端口类型const端口,引脚类型const引脚):
_端口{port},_pin{pin}{
}
};
类执行器{
私人:
Pin const_enable_Pin;
管脚常数管脚;
引脚常数步进引脚;
velocity_type*const_velocity;//指向非常量变量的常量指针
公众:
恒速执行机构(销恒速ep、销恒速dp、销恒速sp、恒速速度\U型速度):
_启用{ep}、{dir}、pin{dp}、{step}、速度(常数投射(&velocity)){
}
void set_-velocity(const-velocity_-type-velocity)const{*_-velocity=velocity;}//尝试更改速度
};
int main(){
constexpr致动器act1(引脚{1,1},引脚{1,2},引脚{1,3},1u);
动作1.设置速度(1u);
}
< C++ >标准(强调矿山)< /P>
表达式e是核心常量表达式,除非
e、 遵循抽象机器的规则,将评估
以下表达式:
(…)
15重新解读


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

即使编译器允许更改指针指向的值,这样做仍然是未定义的行为(因为它包含指向不再存在的值的悬空指针)。我猜标记为错误的语句不满足所需的编译时计算。看看这个:
#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);
}