0

假设我有这样一个结构:

struct Foo
{
  const int bar;
  const char baz;

  Foo& operator=(const Foo& other)
  {
    memcpy(this,&other,sizeof(Foo)); //How am I supposed to write this decently?
    return *this;
  }
}

我希望 Foo 的所有字段都是最终的,并且我希望 Foo 类型的变量的行为就像其他原始值类型一样。比如说,int,我们当然可以这样写:

 int i = 0;
 i = 42;

 Foo foo = {007,'B'}
 foo = {42,'X'}

然而,对于我可怜的 Foo 类型,我是否必须求助于 memcpy 之类的方法来解决类型安全检查?我知道我可以删除 const 修饰符,将字段标记为私有并添加一些 getter,但这不是重点。我只想知道是否有一种体面的方法来编写 = 运算符的内容。

提前致谢!

~~~~~

查看以下示例:

//If the = op is not implemented, this won't compile
Foo stat;
for(int i=0;i!=100;++i)
{
  stat = func(i);
  if(stat.bar == 0)...
}

//But weird thing is, if I declare the 'stat' inside the for block, it works just fine with gcc
for(int i=0;i!=100;++i)
{
  Foo stat = func(i); 
  //printf("%p\n",&stat); => same variable same address!!
  if(stat.bar == 0)...
}

这对你有意义吗?

4

3 回答 3

6

const在 C++ 中,复制赋值对全类型毫无意义。不要实施它。

const在有意义的地方使用所有类型,但要注意这种类型的行为不会int,因为int在 C++ 中根本不是const,除非你这样声明它。

于 2012-09-11T13:13:54.123 回答
3

在这种情况下,写它的体面方法是:

Chunk& operator=(const Foo& other) = delete;

(或作为privateC++11 之前的版本)

如果你所有的成员都是const,你到底为什么要改变他们?

于 2012-09-11T13:13:53.767 回答
0

没有漂亮的方法,我同意您应该重新考虑设计的其他答案。

但是,如果您仍然认为这对您的问题最不利,还有几个选择:

Foo& operator=(const Foo& other)
{
    const_cast<int&>(bar) = other.bar;
    const_cast<char&>(baz) = other.baz;
    return *this;
}

或者

#include <memory>

// Foo must never be used as a base class!
// If your compiler supports the c++11 final feature:
struct Foo final
{ /*...*/ };

Foo& operator=(const Foo& other)
{
    if (this != &other) {
        this->~Foo();
        new(this) Foo(other);
    }
    return *this;
}
于 2012-09-11T13:22:04.243 回答