如何解决如果class具有与class
我有一个带有std::vector
成员的类,该成员与该类具有相同的名称,并且没有用户定义的构造函数;后来我有一个工厂方法生成了这些对象之一:
#include <vector>
class data {
std::vector<int> data;
};
data create()
{
data d{};
// ...
return d;
}
当我尝试使用Visual Studio 2017(15.9.19)构建它时,它无法使用以下命令进行编译:
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 &&)'
在Compiler Explorer上,此代码在MSVC 2019上也失败,但确实在GCC 10.2中进行了编译。那么,这是MSVC中的错误吗?是否不是符合标准的代码?还是这种行为“取决于实现”?
MSVC和GCC均给出明显的错误,即具有用户声明的构造函数的类不能具有相同名称的成员,但是如果该类仅具有编译器生成的构造函数,该怎么办?并将构造函数声明为default
或delete
怎么办,这仍然算作用户声明的内容吗?
顺便说一句,我注意到如果我将成员的类型从std::vector
更改,则MSVC的行为将有所不同,因此该定义可以编译:
class data {
int data;
};
同样,如果工厂只是返回一个右值而不是一个本地值,则MSVC会再次编译它:
data create() { return {}; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。