0

所以我一直在创建这个基本上将源代码(用于着色器)放在一起的“框架”。当我想出创建语句类并重载其所有运算符(完全改变它们的含义)以自然方式形成其他语句的想法时,我认为我非常聪明。它看起来像这样:

class Statement {

public:
    Statement operator=(const Statement &other) const;
    Statement operator+(const Statement &other) const;
    ...

}

然而,当我认为我已经完成时,结果发现 operator= 完全忽略了返回值,而是总是在“=”之前返回对象。我是否正确理解没有办法做到这一点?

编辑:好的,对不起,我提供的示例编译(我在 A 中也重载了运算符,这不起作用)。

编辑 2: operator= 实际上是 const 故意的:它的意图是创建一个新的赋值语句对象。

例子:

Block b; // Represents a sequence of commands.
Statement var1, var2; // Represent some variables.
...
b.append(var1 = var2);

预期:b 包括命令 var1 = var2;

观察到:b 包括 var1;

已解决:问题是因为我使用的是派生类而不是使用其默认运算符 = 的语句。谢谢大家。

4

2 回答 2

4

除非你声明一个,否则一个类总是有一个带有签名的隐式声明的复制赋值运算符:

Statement& operator=(const Statement&)

请注意,它不是const,因此在分配给非 const 对象时是首选,因为您的赋值运算符是 const。[编辑:我的错误,const赋值运算符抑制了隐含的,所以const应该使用非常规限定的赋值运算符。]

(您希望如何分配给即修改,一个 const 对象?)

(注意更准确地说,Statement& operator=(Signature&)如果子对象声明具有该签名的赋值运算符,则隐式声明的赋值运算符可能具有签名,但在您的示例中并非如此。)

于 2012-06-12T23:10:11.143 回答
1

您的代码很好(它适用于g++-4.5.1g++-4.3.4、 Clang 和 VS2010)。如果它不起作用,那么你的编译器一定有问题,或者一定有一些你没有告诉我们的东西。

于 2012-06-12T23:07:56.423 回答