C++ 为易失性和非易失性实例重载类

C++ 为易失性和非易失性实例重载类,c++,overloading,volatile,C++,Overloading,Volatile,我正在编写一个类,它需要同时支持易失性实例和非易失性实例(易失性实例使用原子操作,非易失性实例使用常规操作),我想知道我是否以正确的方式进行操作。以下是迄今为止对类声明的简要介绍: class Yield { public: Yield(); Yield(Yield const &other); Yield(Yield const volatile &other); Yield &operator=(Yield const &ot

我正在编写一个类,它需要同时支持易失性实例和非易失性实例(易失性实例使用原子操作,非易失性实例使用常规操作),我想知道我是否以正确的方式进行操作。以下是迄今为止对类声明的简要介绍:

class Yield {
public:
    Yield();
    Yield(Yield const &other);
    Yield(Yield const volatile &other);

    Yield &operator=(Yield const &other);
    Yield &operator=(Yield const volatile &other);

    Yield &operator+=(Yield const &other);
    Yield &operator+=(Yield const volatile &other);
    Yield volatile &operator+=(Yield const &other) volatile;
    Yield volatile &operator+=(Yield const volatile &other) volatile;

    // Other operators snipped...
};
  • 问题1:使用MSVC编译时,我收到以下警告:

    警告C4521:'util::Yield':指定了多个副本构造函数

    此警告是否预示在使用此类时会出现任何问题?还是可以安全地忽略它

  • 问题2:目前,对于volatile和non-volatile
    other
    参数,所有运算符都重载。我假设这是必要的,以避免对非易失性实例进行较慢的易失性访问?是否有替代方案允许每个方法只编码两次(易失性lhs和非易失性lhs),而不是4次(易失性和非易失性lhs,每个方法都有易失性和非易失性rhs)

我希望把这些问题放在一起是可以的,否则请留下评论,我可以把它们分开。 谢谢

该类具有单一类型的多个副本构造函数。此警告具有信息性;构造函数可以在程序中调用

从msdn网站:


即使使用VC++的特殊、非标准的
volatile
行为,它也会导致比正确编写代码更慢的代码。使用
std::atomic
,或者如果这不可用,那么您可能有特定于平台的屏障、围栏和原子本质。VC++有
\u读写载体
\u互锁
功能来帮助您。

我编辑了您的答案,以提供我认为您想要回答他的问题的部分。下一次,最好提供能够回答问题的部分,而不仅仅是链接到一个网站。是的,我知道volatile不会自动提供安全的多线程,我只想用它来区分需要原子操作(实例共享时)和不需要原子操作(实例仅在本地使用)。不必多次复制代码会很好,但到目前为止,其他变体(例如使用模板)甚至更糟糕。
volatile
不提供任何多线程功能,也不提供任何原子性。考虑把你的函数命名为原子或类似的东西,而不是使用<代码>易失性< /代码>代码> ,这样人们阅读你的代码就能知道它所做的事情。