gpt4 book ai didi

c++ - std::initializer_list 构造函数

转载 作者:IT老高 更新时间:2023-10-28 23:16:55 29 4
gpt4 key购买 nike

在这样的代码中:

#include <iostream> 
#include <initializer_list>
#include <string>

struct A
{
A() { std::cout << "2" << std::endl; }
A(int a) { std::cout << "0" << std::endl; }
A(std::initializer_list<std::string> s) { std::cout << "3" << std::endl; }
A(std::initializer_list<int> l) { std::cout << "1" << std::endl; }
};

int main()
{
A a1{{}};
}

为什么叫 std::initializer_list<int>构造函数的规范?如果我们定义,例如,构造函数带有std::initializer_list<double>,它会产生歧义编译错误。 .这种构造的规则是什么,为什么它对 std::initializer_list 如此具体用数字作为模板参数?

最佳答案

如果一个类有一个初始化列表构造函数,那么 {whatever goes here}表示通过{whatevergoeshere}作为当前构造函数的参数(如果没有初始化列表构造函数,则 whatever goes here 作为参数传递)。

所以让我们简化设置并忽略其他构造函数,因为显然编译器并不关心它们

void f(std::initializer_list<std::string> s);
void f(std::initializer_list<int> l);

对于 f({{}})我们有这个规则

Otherwise, if the parameter type is std​::​initializer_­list and all the elements of the initializer list can be implicitly converted to X, the implicit conversion sequence is the worst conversion necessary to convert an element of the list to X, or if the initializer list has no elements, the identity conversion. This conversion can be a user-defined conversion even in the context of a call to an initializer-list constructor.

这里我们只有一个元素 {}它需要用户定义的转换来初始化 std::string并且 int 没有转换(身份) .因此,int被选中。

对于 f({{{}}})元素是 {{}} .可以转换成int ?规则是

  • if the initializer list has one element that is not itself an initializer list, the implicit conversion sequence is the one required to convert the element to the parameter type
  • ...
  • In all cases other than those enumerated above, no conversion is possible.

可以转换成std::string ?是的,因为它有一个具有 std::initializer_list<char> init 的初始化列表构造函数。范围。因此,std::string这次选择了。


A a3({}) 的区别是在这种情况下,它不是列表初始化,而是带有 {} 的“正常”初始化参数(请注意,由于缺少外部大括号,因此嵌套少了一个)。这是我们的两个f -函数被调用 {} .而且由于两个列表都没有元素,因此我们都有身份转换,因此存在歧义。

这种情况下的编译器也会考虑 f(int)并与其他两个功能打成平手。但是将适用一个决胜局,宣布 int -参数比initializer_list差参数。所以你有一个部分订单{int} < {initializer_list<string>, initializer_list<int>} ,这就是产生歧义的原因,因为最好的转换序列组不包含一个候选者,而是两个。

关于c++ - std::initializer_list 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48496848/

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