简体   繁体   English

为什么在初始化此类时不调用列表初始化?

[英]why is list initialization not invoked when initialize this class?

according to value initialization described in this pagehttps://en.cppreference.com/w/cpp/language/value_initialization根据本页https://en.cppreference.com/w/cpp/language/value_initialization 中描述的值初始化

If T is a class type that has no default constructor but has a constructor taking std::initializer_list, list-initialization is performed.如果 T 是一个没有默认构造函数但有一个采用 std::initializer_list 的构造函数的类类型,则执行列表初始化。

so I was expecting when initialize the class in bellow code snippet will invoke Myclass(const std::initializer_list<int> &l) , but the compiler says所以我期待在下面的代码片段中初始化类时会调用Myclass(const std::initializer_list<int> &l) ,但编译器说

> the default constructor of "Myclass" cannot be referenced -- it is a deleted function

why is that?这是为什么? this is the code, I compiled with Mingw64 C++11 on windows.这是代码,我在 Windows 上用 Mingw64 C++11 编译。

#include <iostream>
class Myclass {
    public:
     Myclass() = delete;
     Myclass(Myclass &&m) {}
     Myclass(const Myclass &m) {}
     Myclass(const std::initializer_list<int> &l) { std::cout << "initializer list"; }
};
int main(int argc, char const *argv[]) {
    Myclass m2 {};
     Myclass m1={};
}

Myclass does have a default constructor; Myclass确实有一个默认构造函数; which is just marked as delete explicitly.这只是明确标记为delete So the effect of value-initialization should be:所以值初始化的效果应该是:

  1. if T is a class type with no default constructor or with a user-provided or deleted default constructor, the object is default-initialized ;如果 T 是没有默认构造函数或具有用户提供或删除的默认构造函数的类类型,则该对象是默认初始化的

In default-initialization the deleted default constructor is selected and the program is ill-formed.默认初始化中,删除的默认构造函数被选中并且程序格式错误。

If not to declare the default constructor as如果不将默认构造函数声明为

class Myclass {
    public:
     // Myclass() = delete;
     Myclass(Myclass &&m) {}
     Myclass(const Myclass &m) {}
     Myclass(const std::initializer_list<int> &l) { std::cout << "initializer list"; }
};

Then Myclass doesn't have default constructor;然后Myclass没有默认构造函数; (and no implicitly-declared default constructor because of other user-declared constructors). (并且没有隐式声明的默认构造函数,因为其他用户声明的构造函数)。 Then list-initialization is performed (as you expected), as the effect然后执行 列表初始化(如您所料),效果如下

All constructors that take std::initializer_list as the only argument, or as the first argument if the remaining arguments have default values, are examined, and matched by overload resolution against a single argument of type std::initializer_list所有采用std::initializer_list作为唯一参数的构造函数,或者如果其余参数具有默认值,则作为第一个参数,都被检查,并通过 重载决议std::initializer_list类型的单个参数匹配

Checkout this post .结帐这篇文章 in a nutshell:简而言之:

  • If the default constructor is explicitly deleted, the compiler will assume there can't be any default constructor如果显式删除默认构造函数,编译器将假定不能有任何默认构造函数
  • If, however, you remove the Myclass() = delete;但是,如果您删除Myclass() = delete; line, it will choose the best constructor, aka your initialized_list one.行,它会选择最好的构造函数,也就是你的initialized_list一个。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在初始化列表中初始化类数组C ++ - initialize class array in initialization list c++ 如果成员是模板类,则在初始化列表中初始化某个类的成员 - initialize a member of some class in initialization list if the member is a template class 初始化初始化列表中的引用 - initialize reference in initialization list 在类构造函数初始化列表中初始化对象数组的第一个条目 - Initialize first entries of an array of objects in class constructor initialization list 我可以和另一个类成员一起初始化初始化列表中的对象吗? - Can I initialize an object in the initialization list with another class member? 为什么我不能使用统一初始化初始化初始化列表中的引用? - Why can't I initialize a reference in an initializer list with uniform initialization? 为什么我不能用list-initialization初始化std :: vector - Why can't I initialize std::vector with list-initialization 在初始化列表中初始化静态成员 - Initialize static member in initialization list 如何通过C ++中构造函数的初始化列表来值初始化类的私有结构成员? - how can I value initialize private struct member of class via initialization list of constructor in c++? boost原子类使初始化值不同于成员初始化列表 - boost atomic class make initialize values different from member initialization list
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM