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

C++ 初始化此类时为什么不调用列表初始化?,c++,c++11,initialization,list-initialization,value-initialization,C++,C++11,Initialization,List Initialization,Value Initialization,根据本页所述的值初始化 如果T是一个类类型,它没有默认构造函数,但有一个构造函数采用std::initializer\u list,则执行列表初始化 所以我希望在下面的代码片段中初始化类时调用Myclass(const std::initializer\u list&l),但是编译器说 > the default constructor of "Myclass" cannot be referenced -- it is a deleted function 为什么呢

根据本页所述的值初始化

如果T是一个类类型,它没有默认构造函数,但有一个构造函数采用std::initializer\u list,则执行列表初始化

所以我希望在下面的代码片段中初始化类时调用
Myclass(const std::initializer\u list&l)
,但是编译器说

> the default constructor of "Myclass" cannot be referenced -- it is a deleted function
为什么呢?这是我在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{
公众:
Myclass()=删除;
Myclass(Myclass&&m){}
Myclass(常量Myclass&m){}
Myclass(const std::initializer_list&l){std::coutCheckout。简而言之:

  • 如果默认构造函数被显式删除,编译器将假定不存在任何默认构造函数
  • 但是,如果删除
    Myclass()=delete;
    行,它将选择最好的构造函数,也就是您的
    initialized\u列表

Myclass
确实有一个默认构造函数;它只是显式标记为
delete
。因此值初始化的效果应该是:

  • 如果T是没有默认构造函数的类类型,或者是用户提供或删除了默认构造函数的类类型,则对象为
  • 在“已删除”对话框中,选择了默认构造函数,并且程序格式不正确

    如果不将默认构造函数声明为

    class Myclass {
        public:
         // Myclass() = delete;
         Myclass(Myclass &&m) {}
         Myclass(const Myclass &m) {}
         Myclass(const std::initializer_list<int> &l) { std::cout << "initializer list"; }
    };
    
    class-Myclass{
    公众:
    //Myclass()=删除;
    Myclass(Myclass&&m){}
    Myclass(常量Myclass&m){}
    
    Myclass(const std::initializer_list&l){std::cout“如果
    T
    是一个没有默认构造函数的类类型…”,但是
    T
    确实有一个默认构造函数,该构造函数将被删除。