gpt4 book ai didi

c++ - 在赋值期间,如何使volatile结构表现得完全像volatile int?

转载 作者:行者123 更新时间:2023-12-01 14:44:45 24 4
gpt4 key购买 nike

当从非 Volatile volatile int分配给int时,编译器。当从相同类型的非 Volatile volatile struct中的struct中分配代码时,编译器似乎非常不满意。

考虑下面的简单程序。

struct Bar {
int a;
};

volatile int foo;
int foo2;

volatile Bar bar;
Bar bar2;

int main(){
foo = foo2;
bar = bar2;
}

当我尝试编译此代码时,在main的第二行而不是第一行出现错误。
g++     Main.cc   -o Main
Main.cc: In function ‘int main()’:
Main.cc:13:9: error: passing ‘volatile Bar’ as ‘this’ argument discards qualifiers [-fpermissive]
bar = bar2;
^
Main.cc:1:8: note: in call to ‘Bar& Bar::operator=(const Bar&)’
struct Bar {

似乎出现了问题,因为 volatile Bar传递到了赋值运算符的左侧,尽管我不确定为什么这不是 int的问题。

我查看了 this answer,它提出了以下修复措施。
struct Bar {
int a;
volatile Bar& operator= (const Bar& other) volatile {
*this = other;
}
};

不幸的是,这导致了以下两个警告。
g++     Main.cc   -o Main
Main.cc: In member function ‘volatile Bar& Bar::operator=(const Bar&) volatile’:
Main.cc:4:21: warning: implicit dereference will not access object of type ‘volatile Bar’ in statement
*this = other;
^
Main.cc: In function ‘int main()’:
Main.cc:16:15: warning: implicit dereference will not access object of type ‘volatile Bar’ in statement
bar = bar2;

然后,我查看了 this answer,其中提到我应该将引用转换为一个右值,但是我不确定要转换的引用以及在这种情况下要使用的转换语法。

是什么正确的咒语才能使main的第2行的行为与main的第1行完全一样,而没有警告或错误?

最佳答案

您最初的问题是因为隐式赋值运算符具有签名

Bar& operator=(const Bar& rhs);

...而 volatile对象则无法调用。警告是因为更新后的函数返回了 Volatile 引用,但是从未使用过该引用。 GCC认为这可能是个问题。解决此问题的最简单方法是将返回类型更改为void!

还有另一个问题:您的函数将以无限递归方式进行调用。我建议以下内容:
struct Bar {
int a;
Bar& operator=(const Bar&rhs) = default;
void operator=(const volatile Bar& rhs) volatile // Note void return.
{
// Caution: This const_cast removes the volatile from
// the reference. This may lose the point of the original
// volatile qualification.
//
// If this is a problem, use "a = rhs.a;" instead - but this
// obviously doesn't generalize so well.
const_cast<Bar&>(*this) = const_cast<const Bar&>(rhs);
}
};

volatile Bar vbar;
Bar bar;

int main(){
vbar = bar; // All four combinations work.
bar = vbar;
vbar = vbar;
bar = bar;
return 0;
}

这意味着在使用 Volatile 结构时,您将无法链接分配运算符。我断言这不是很大的损失。

最后一点:为什么要使用 volatile-它对多线程代码不是很有用(它对内存映射IO很有用)。

关于c++ - 在赋值期间,如何使volatile结构表现得完全像volatile int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39995280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com