I had a class with a std::vector
member that had the same name as the class and had no user-defined constructors; later I had a factory method that generated one of these objects:
#include <vector>
class data {
std::vector<int> data;
};
data create()
{
data d{};
// ...
return d;
}
When I try to build this with Visual Studio 2017 (15.9.19), it fails to compile with:
error C2664: 'data::data(data &&)': cannot convert argument 1 from 'std::vector<int,std::allocator<int>>' to 'const data &'
note: Reason: cannot convert from 'std::vector<int,std::allocator<int>>' to 'const data'
note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
note: This diagnostic occurred in the compiler generated function 'data::data(data &&)'
On Compiler Explorer, this code also failed on MSVC 2019, but does compile in GCC 10.2. So is this a bug in MSVC, is it not standard compliant code, or is this behaviour "implementation dependent"?
Both MSVC and GCC give clear errors that a class with user-declared constructors can't have a member of the same name, but what if the class just has compiler generated constructors? And what about declaring constructors as either default
or delete
, does that still count as user-declared?
BTW, I notice that the behaviour of MSVC was different if I changed the type of the member from std::vector
, so this definition did compile:
class data {
int data;
};
And likewise if the factory just returned an rvalue rather than a local, MSVC again did compile it:
data create() { return {}; }
According to the standard class.mem#21
if class T has a user-declared constructor, every non-static data member of class T shall have a name different from T.
So your code above is valid, and the compiler must accept it. Bug reported: https://developercommunity.visualstudio.com/t/generated-constructors-if-class-has-a-member-with/1626621
what about declaring constructors as either
default
ordelete
, does that still count as user-declared?
Yes, these are also considered as user-declared constructors.
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