列出初始化规则



我想用count和value初始化std::vector<char>

如此:

int n = 100;
std::vector<char> v(n, 0);

然而,列表初始化std::vector<char> v{n, char(0)};给了我:

warning: narrowing conversion of ‘n’ from ‘int’ to ‘char’.

是否有一种方法来使用列表初始化语法,但避免initializer_list构造函数调用?

遗憾的是,没有。

当您要对std::vector进行列表初始化时,它将首先尝试使用带有std::initializer_list参数的构造函数。只有当没有合适的匹配时才会考虑其他构造函数。

引自cppref

  • 所有将std::initializer_list作为唯一实参,或者在其他实参都有默认值的情况下将其作为第一个实参的构造函数,都将被检查,并通过重载解析对std::initializer_list类型的单个实参进行匹配。
  • 如果前一阶段没有产生匹配,则T的所有构造函数都参与针对由带括号的init-list的元素组成的参数集的重载解析,并限制仅允许非窄化转换。如果这个阶段产生一个显式构造函数作为复制列表初始化的最佳匹配,编译失败(注意,在简单的复制初始化中,根本不考虑显式构造函数)。

在你的例子中,因为charint之间的类型转换是允许的,所以使用了带有std::initializer_list的构造函数。

对于初始化std::vector(和其他容器),我的建议是不要使用列表初始化,除非您使用std::initializer_list初始化并仅使用copy-list-initialization。

struct A {};
std::vector<A> v1{100}; // ok, the size of v1 is 100
std::vector<A> v2(100); // better, the size of v2 is 100
std::vector<A> v3 = {100}; // compiles error

相关内容

  • 没有找到相关文章

最新更新