首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解[这个代码片段](https://godbolt.org/z/416s737WK)以正确的方式?)

如何理解[这个代码片段](https://godbolt.org/z/416s737WK)以正确的方式?)
EN

Stack Overflow用户
提问于 2022-05-02 09:26:48
回答 1查看 73关注 0票数 0

如何正确理解这个代码片段

代码语言:javascript
复制
#include <vector>
#include <iostream>
 
#ifdef MORE_QUESTION
void f(std::initializer_list<int> const &items){};
void g(std::vector<int> const &items){};
#endif

struct foo {
    template<typename T>  
    foo(std::initializer_list<T>) {std::cout << "here" << std::endl;} 
};

int main()
{
    foo x{1,2,3}; // What's this?

#ifdef MORE_QUESTION
    f({1,2,3,4}); 
    g({1,2,3,4}); 
#endif
}

有关上述代码片段的问题:

什么是foo x{1,2,3};

EN

回答 1

Stack Overflow用户

发布于 2022-05-03 14:09:27

foo ({1,2,3,4});外部()表示调用构造函数,内部{}表示std::initializer_list的对象。对于foo x{1,2,3},我完全糊涂了。-

不,“外层()”和“内部{}”的含义与你所描述的不完全一样。这些示例是C++中两种(多种)变量初始化。outer {}和outer ()只告诉您要使用哪种初始化,没有其他:

代码语言:javascript
复制
T var( stuff ); // direct-initialization

T var{ stuff }; // direct-list-initialization

每种方法都可以从许多不同类型的stuff中以许多不同的方式初始化大量Ts。长时间阅读,初始化初始化

stuff可以做的许多事情中,它可以是逗号分隔的表达式列表(如1,2,3 ),也可以是以大括号括起来的以逗号分隔的表达式列表(如{1,2,3} )。

代码语言:javascript
复制
T var(  1,2,3  ); // works for some T
T var( {1,2,3} ); // works for some T
T var{  1,2,3  }; // works for some T
T var{ {1,2,3} }; // works for some T

您的类型foo恰好支持这4种初始化类型中的3种,因为在本例中,它们都调用了您提供的相同的initializer_list构造函数。另外,他们中没有一个人会处理任何initializer_list

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72084756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档