initializer_list和默认构造函数重载决策

And*_*zos 4 c++ c++11

#include <initializer_list>
#include <iostream>
using namespace std;

struct Y {};

struct X
{
    X(initializer_list<Y>) { cout << "yay" << endl; }
    explicit X() { cout << "boo" << endl; }
};

X f()
{
    return {};
}

int main()
{
    f();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这打印出"嘘声".为什么不打印出"yay"?

无论如何要区分以下两种结构:

  1. X()
  2. X{}

要么

  1. return X();
  2. return {};

要么

void g(const X&)
Run Code Online (Sandbox Code Playgroud)
  1. g(X())
  2. g({})

谢谢.

Nic*_*las 5

无论如何要区分以下两种结构:

不,它们不是不同的结构.

{}构造函数语法的主要目的是引入统一初始化,使初始化工作在任何地方都相同.如果他们之间存在差异,那就不一致了.

如果要使用空初始化列表构造函数,则必须声明您正在显式传递初始化列表.像这样:return initializer_list<Y>{};当然,统一初始化的其他目的之一就是不必输入类型名这么多,所以你可以达到同样的效果return {{}};


Mik*_*our 5

return {}; 如果有的话,将始终使用默认构造函数.

return X({});或者return {{}};将从空的初始化列表构造.