gpt4 book ai didi

c++ - 使用空的初始化列表直接初始化

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:00 25 4
gpt4 key购买 nike

struct X
{
X() { std::cout << "default ctor" << std::endl; }

};

int main()
{
X({});
}

打印出来

default ctor

这是有道理的,因为空括号值初始化对象(我认为)。然而,

struct X
{
X() { std::cout << "default ctor" << std::endl; }
X(std::initializer_list<int>) { std::cout << "initializer list" << std::endl; }
};

int main()
{
X({});
}

为此,我得到了

initializer list

我不觉得这种行为很奇怪,但我并不完全相信。这是什么规则?

此行为是否写入标准的某些部分?

最佳答案

要查看实际情况,声明复制和移动构造函数,在 C++14 模式或更早版本中编译,并禁用复制省略。

Coliru link

输出:

default ctor
move ctor

在第一个片段中,编译器寻找 X 的构造函数接受一个参数,因为您提供了一个参数。这些是复制和移动构造函数,X::X(const X&)X::X(X&&) ,如果您不自己声明它们,编译器将隐式为您声明。然后编译器转换 {}X使用默认构造函数的对象,并传递 X对象到移动构造函数。 (您必须使用 fno-elide-constructors 才能看到这一点,否则编译器将省略移动,并且在 C++17 中复制省略成为强制性的。)

在第二个片段中,编译器现在可以选择转换 {}X (然后调用移动构造函数),或转换 {}std::initializer_list<int> (然后调用初始化列表构造函数)。根据[over.ics.list]/6.2,转换自{}X调用默认构造函数的是用户定义的转换,而根据[over.ics.list]/4,从{}的转换至 std::initializer_list<int>是身份转换。身份转换优于用户定义的转换,因此编译器调用初始化列表构造函数。

关于c++ - 使用空的初始化列表直接初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48617690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com