【发布时间】:2018-09-25 19:01:04
【问题描述】:
所以根据this article,符号A() 和new A() 导致值初始化。我的理解是,这两种符号都应该转换为默认初始化
如果 T 是一个没有默认构造函数的类类型或 用户提供或删除的默认构造函数,对象为 默认初始化;
它们应该导致相同的行为。那么,为什么会这样:
class Image
{
public:
Image();
virtual ~Image();
protected:
std::string _filePath;
protected:
// noncopyable
Image(const Image& rImg);
Image& operator=(const Image&);
bool initWithImageFileThreadSafe(const std::string& fullpath);
};
int main()
{
auto a = new Image(); //Works
auto aa = Image(); //Error: inaccessible constructor
}
【问题讨论】:
-
按预期编译here。
main中的第二行需要 C++17 来实现 “保证省略”。 -
干净编译:直播godbolt.org/z/OdMGDQ 或许可以添加工具链和开关的详细信息。
-
C++14 live 失败:godbolt.org/z/wsVmt7 但您的 cmets 似乎已被交换。
-
啊,C++17 的保证复制省略在这里发挥了作用。
标签: c++