无法更改volatile变量的值

Cannot change value of volatile variable

本文关键字:变量 volatile      更新时间:2023-10-16

描述:

当变量被定义为volatile(在Main中)时,我不能设置或更改它。删除volatile解决了这个问题,但我需要我的变量是volatile。

我的尝试:

真的有很多尝试。重载运算符=,使新运算符=易失性,使新方法易失性。到目前为止,没有任何实际效果。

我的主页:

int main() {
    volatile PlaceParentConversion s(10.0); // remove volatile = no errors
    std::cout << s.mX << std::endl;
    s = PlaceParentConversion::IDENTITY_CONVERSION;
    std::cout << s.mX << std::endl;
    return 0;
}

我的班级:

class PlaceParentConversion {
public: //all public, easier to check
    const static PlaceParentConversion IDENTITY_CONVERSION;
    double mX;
    PlaceParentConversion(const double x);
    PlaceParentConversion(const PlaceParentConversion& other);
};
const PlaceParentConversion PlaceParentConversion::IDENTITY_CONVERSION(0);
PlaceParentConversion::PlaceParentConversion(const double x) : mX(x) {}
PlaceParentConversion::PlaceParentConversion(const PlaceParentConversion& other) : mX(other.mX) {}

错误:

‘volatile PlaceParentConversion’ as ‘this’ argument of ‘PlaceParentConversion& PlaceParentConversion::operator=(const PlaceParentConversion&)’ discards qualifiers [-fpermissive] 

定义volatile赋值运算符:

Foo volatile & operator=(Foo const & rhs) volatile
{
    // ...
    return *this;
}

(为了便于阅读,我缩短了你的类名。)


这里有一个更完整的例子:

struct Foo
{
    Foo() { }
    Foo(Foo const volatile &) { }
    Foo volatile & operator=(Foo const &) volatile
    { return *this; }
};
int main()
{
    volatile Foo x;
    Foo y;
    static_cast<Foo>(x = y);
}

最后一行中的静态强制转换使GCC不会发出对volatile对象没有访问的警告,这是赋值表达式求值的结果:标准规定在void上下文中没有左值到右值的转换,因此没有访问。我们将转换明确化。

是的,这是正确的,因为您没有volatile PlaceParentConversion& operator =(const PlaceParentConversion&) volatile;