2013-07-12 145 views
1

在C++中为类定义运算符赋值时,我注意到您不需要返回* this。我在Visual Studio 2012,Visual Studio 2010中测试了这个警告级别为4,并且没有错误或警告,并且代码按预期工作。但在Visual Studio 2008中,我收到了一个编译时错误,说'操作符=必须返回一个值'。C++赋值运算符默认返回

我的问题是:是这样的“功能”除了核心的C++语言,或者是它的东西是,森林狼队决定在添加

,如果这已问我道歉或有信息。这在线上,我无法找到任何答案。

template <typename T> 
struct singleton 
{ 
T value; 

singleton(const singleton& x) : value(x.value) {} 
singleton() {} 
~singleton() {} 
singleton& operator=(const singleton& x) { value = x.value; } 
}; 

这是我用于测试的代码:

singleton<float> sf; 
sf.value = 1.9f; 
singleton<float> sf2 = sf; 
std::cout << sf2.value << std::endl; 
+0

您是否有示例? – 0x499602D2

+1

你有'singleton&'作为返回值,但不返回任何内容。 – Rapptz

+0

@Rapptz我知道,但它似乎是合法的VS2012即使有警告级别4 – user2574802

回答

2

在你的例子中,你的问题来自函数返回singleton&,但是你实际上并没有返回任何东西(即*this)。该标准认为这是未定义的行为。

节6.6.3.2

流动ÔFF的函数的结束相当于没有 值的回报;这会导致函数返回函数中的未定义行为

+0

谢谢,我明白我只是觉得奇怪,我没有收到任何警告/错误。 – user2574802

+0

可能值得注意的是,AFAIK,赋值运算符不需要*返回任何东西。它可以是一个“空白”方法。但是,这会禁用像'a = b = c = d;'这样的用法 – yzt

0

这是返回非空到有没有返回值的函数未定义的行为。这可能是允许的,但并不意味着它符合标准。

+0

谢谢,我认为这将是很好的简约代码,只是想检查标准对此所说的话。 – user2574802