C++ 未调用重载的赋值运算符

C++ 未调用重载的赋值运算符,c++,operator-overloading,C++,Operator Overloading,谢谢大家的回答。感谢你的真知灼见和godbolt,我不知道这些 我在这里编辑了我的问题我想做什么。基本上,我有一个SDK采集函数,它有一个指针浮点参数作为输入,我想实时监控该参数以了解采集的状态。现在我有了这个代码: #include <iostream> template <class T> class MonitoredVariable { public: MonitoredVariable() {} // MonitoredVariable(cons

谢谢大家的回答。感谢你的真知灼见和godbolt,我不知道这些

我在这里编辑了我的问题我想做什么。基本上,我有一个SDK采集函数,它有一个指针浮点参数作为输入,我想实时监控该参数以了解采集的状态。现在我有了这个代码:

#include <iostream>

template <class T>
class MonitoredVariable
{
public:
    MonitoredVariable() {}
   // MonitoredVariable(const T& value) : m_value(value) {}

    operator T&() { return m_value; }
   //operator const T&() const { return m_value; }

    MonitoredVariable& operator = (float value)
    {
        printf("Variable modified\n");
        this->m_value = &value;
        printf("%f \n", *this->m_value);
   
        return *this;
    }

      MonitoredVariable&  operator * () {return *this;}
    
private:
    T m_value;
};

void SDKfunctionIcannotChange(float *a)
{
    *a = (float) 5.2; 
    printf("%f \n", *a); // if I comment this out, x will not update?!?!
    return;
}

int main()
{
    MonitoredVariable<float*> x;
    *x=0;
    SDKfunctionIcannotChange(x);
    printf("%f \n", *x);
    
return 1;
}
没有

Variable modified
0.000000 
0.000000 
谢谢.

x表达式使用x参数调用运算符*。在过程中,找到指针的内置运算符*。假设您的类MonitoredVariable有一个到T的转换运算符(在您的例子中是指针类型),那么将调用该转换运算符,然后取消对返回的指针(null)的引用,从而导致崩溃


您可能想写的是x=y。

在广泛编辑之前,这回答了原始问题

基本上,您的程序相当于:

int main { float*x=nullptr; 浮动y=5; *x=y;//这里是UB,因为x==nullptr } 请参阅:有问题的行看起来像*static_castx.operator float*&=y;。因此,您的代码不使用自定义运算符=,而是使用转换运算符。 基本上问题是使用模板的代码

我不知道你的意图是什么,也许是:

包括 样板 类监视变量 { 公众: 可监视的{} MonitoredVariableconst T&value:m_valuevalue{} 运算符T&{返回m_值;} 运算符const T&const{return m_value;} 监控变量和运算符=常量T和值 { printfVariable已修改\n; m_value=value;//这里还有一个问题 归还*这个; } int main { 监控变量x; 浮动y=5; x=&y; 回来 }
*m_value=value.m_value;是未定义的行为,因为您从未将m_value设置为指向浮点。要存储浮点,您需要一个浮点,而不仅仅是指针*x不是类的实例。隐式转换一开始似乎是一个好主意,但实际上不是。在您的中添加一些打印。浮点*!=float。无关:void main是无效的C++。使它在MINPPS中:我的第一个评论部分是由于我误读了代码。然而,这是问题的一部分,所以我留下评论,尽管它不是十分正确的替代方案,可以使模板参数浮动而不是浮点*,这将简化使用。意图。如果OP定义了运算符*?@Lingo,那么显然会调用该运算符。但是,OP还必须实现一个引用代理来拦截以下赋值。目前尚不清楚MonitoredVariable类的意图是什么,因此我无法判断这是否是推荐的解决方案。
Variable modified
0.000000 
0.000000