constexpr类中的C 常量指针

c++ constant pointer in the constexpr class

本文关键字:常量 指针 constexpr      更新时间:2023-10-16

美好的一天!请帮助我以获取代码,我尝试将ConstexPR类与未来的const指针进行指向非恒定变量,并更改非构造变量,我的编译器说

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

对象ACT1始终生命,因为它的手臂嵌入式设备代码

代码:

#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);
}

根据c 标准[expr-const]/2(强调矿山(

表达式E是核心常数表达式,除非 e,遵循抽象机器的规则,将评估之一 以下表达式:
(...(
15. reinterpret_cast

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