Skip to content

C++的花括号初始化就是用来匹配std::initializer_list构造函数的吗? #207

Answered by Mq-b
mq-loser asked this question in Q&A
Discussion options

You must be logged in to vote

显然不是,虽然在某些情况下它会优先。不过事实上 {} 自身的作用可以说是数不胜数,它不是表达式,没有类型。

不多bb,参见上古博客

回到最开始的问题

C++的花括号初始化就是用来匹配std::initializer_list构造函数的吗?

我们可以随便举出很多的反例:

#include <iostream>
#include <vector>

struct X{
    X() { puts("X"); }
};

int main(){
    std::vector<X> v{10};
}

{10} 匹配到的是 std::vector 的

constexpr explicit vector( size_type count, const Allocator& alloc = Allocator() );

C++20 起,构造拥有 count 个 默认插入的 T 实例的容器。


std::vector v{std::vector{1,2,3}};  // std::vector<int>
std::vector v{std::vector{1},std::vector{2}}; //就能得到std::vector<std::vector<int>>
  • 当从类型为正在构造的类模板的特化或特化子级的单个元素进行初始化时,复制构造函数优先于列表构造函数

在 loser Homework 第12题:实现 make_vector 有详细讲解。

Replies: 1 comment 1 reply

Comment options

You must be logged in to vote
1 reply
@Matrix-A
Comment options

Answer selected by mq-loser
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Q&A
Labels
None yet
3 participants