我已经在VS2013和Dev-C++上运行了这个代码但是当副本赋值没有返回任何实际应该的时候,编译器不会引发任何错误,请帮我解释一下.
#include <iostream>
using namespace std;
class sample
{
public:
sample()
{
cout << "X::X()" << endl;
}
sample(sample const &)
{
cout << "X::X( X const & )" << endl;
}
sample& operator=(sample const &)
{
cout << "X::operator=(X const &)" << endl;
}
};
sample f()
{
sample tmp;
return tmp;
}
int main()
{
int a;
sample x = f();
cin >> a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我改为:
sample x;
x = f();
Run Code Online (Sandbox Code Playgroud)
VS2013编译器会引发如下错误:错误1错误C4716:'sample :: operator =':必须返回值c:\ users\xxx\desktop\test\test\main.cpp 33 1测试
严格地说,编译器不需要诊断此错误,因为充分扭曲的功能可能使这非常困难甚至不可能.但是,一个像样的编译器应该能够在这样的简单情况下发出警告; 例如,GCC将指定-Wreturn-type或-Wall.
根据你的说法,它听起来像Visual Studio,无论你使用什么设置,只有在调用函数时才会诊断它.您的第一段代码执行复制初始化(调用复制构造函数),但没有赋值,因此不调用赋值运算符.