I appreciate the C++11 standard dictates:
If the class definition does not explicitly declare a copy constructor, one is declared implicitly. If the class definition declares a move constructor or move assignment operator, the implicitly declared copy constructor is defined as deleted; otherwise, it is defined as defaulted.
(actually copied from here)
The following code:
#include <iostream>
struct C
{
int x = 1;
C()
{
}
C(C&&)
{
}
};
int main()
{
const C c;
C c2(c);
std::cout << c.x << " " << c2.x << std::endl;
return 0;
}
does not compile on gcc 4.9.0, but compiles just fine on Visual Studio 2013 (Compiler Version 18.00.21005.1 for x86). Is this yet another Visual Studio violation of the standard, or am I doing something wrong this time? If this is a violation of the standard, is there a tracking bug or any source where this behaviour is documented?
You're not doing anything wrong, and your interpretation of the standard is correct. Visual C++ 2013 indeed does not implement these rules properly.
A relevant bug report is here:
Default copy constructor is generated even when a custom move constructor is defined [c++11]
It's marked as Won't Fix and the comment from the development team is:
Visual Studio 2013 indeed does not fully implement the C++11 rules governing special member functions and move operations. We will include a fix for this bug in the next major release of Visual Studio.
The good news is that things seem to be working properly in Visual C++ 2015 RC. I've just verified that your code triggers both compiler and IntelliSense errors. The compiler diagnostic is:
error C2280: 'C::C(const C &)': attempting to reference a deleted function
(From what I've tested during the past few months, MSVC14 is shaping up as a pretty good C++ compiler - lots of standard compliance issues have been fixed.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With