草庐IT

copy-initialization

全部标签

c++ - 带有 initializer_list 的可选构造函数

这个特殊的构造函数采用初始化列表的目的是什么。有人可以举例说明这在什么时候有用吗?templateconstexprexplicitoptional(in_place_t,initializer_listil,Args&&...args);上面和这个有什么不同?templateconstexprexplicitoptional(in_place_t,Args&&...args);引用:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3793.html#optional.object.ctor附:不确定是使用c++14还是

c++ - Initializer_list 作为非模板上下文中数组引用参数的参数

我的问题涉及这个非常简单且简短的代码,其中尝试在接受数组引用参数的两个非模板函数之间进行重载解析。该问题已在其他地方发布,但在模板扣除上下文中。代码如下:#includevoidfoo(constint(&x)[3]){std::coutg++4.8.3编译此代码,选择第一个函数作为(我想)唯一可行的,而clang3.4没有编译它,说对foo的调用是模棱两可的(为什么?)。哪个编译器做正确的事?即使删除第二个重载,clang也不会编译代码:似乎根本不接受initializer_list来初始化数组引用。这是buggy吗? 最佳答案

C++ 静态工厂方法与构造函数 : how to avoid copying?

Thisquestion要求以简洁的方式在C++中实现静态工厂方法,thisanswer描述了一种明确的方法。返回值优化将使我们免于制作不必要的Object拷贝,从而使这种创建Object的方式与直接调用构造函数一样高效。在私有(private)构造函数中将i复制到id的开销可以忽略不计,因为它是一个小的int。但是,当Object包含作为类Foo实例的实例变量(需要复杂的初始化逻辑)时,问题和答案并未涵盖更复杂的情况)而不是一个小的原始类型。假设我想使用传递给Object的参数构造Foo。使用构造函数的解决方案如下所示:classObject{Foofoo;public:Object

c++ - Clang 和 GCC 之间的 const auto std::initializer_list 区别

我试图了解在结合初始化列表和constauto时C++11的正确行为应该是什么?.对于以下代码,我在GCC和Clang之间得到了不同的行为,并且想知道哪个是正确的:#include#include#includeintmain(){conststd::initializer_listl1={1,2,3};constautol2={1,2,3};std::cout用g++编译的输出是:explicit:St16initializer_listIiEauto:St16initializer_listIKiE虽然clang++编译的版本产生:explicit:St16initializer_

c++ - 错误 C2614 : 'ChildClass' : illegal member initialization: 'var1' is not a base or member

我在C++中收到以下错误:errorC2614:'ChildClass':illegalmemberinitialization:'var1'isnotabaseormemberClassBase{protected:intvar1;public:Base(){var1=0;}}classChild:publicBase{intchld;public:Child():var1(0){chld=1;}}我觉得我所做的是按照OO协议(protocol)。这里var1是Base类的数据成员,以protected作为访问说明符。所以它可以被继承,它会在child身上变成私有(private)的

c++ - std::initializer_list,大括号初始化和 header

在阅读不同主题时,我遇到了一种奇怪的行为,至少对我来说是这样。这整个想法源于auto之间的特殊互动。和大括号。如果你写这样的东西:autoA={1,2,3}编译器会推导出A成为std::initializer_list.奇怪的是,类似的规则不仅适用于auto。,那里可能有特殊的原因呢,也可能是其他的事情。如果你写如下:templatevoidf(std::vectorVector){//dosomething}你当然不能这样调用它:f({1,2,3});即使std::vector可以支撑初始化。但是,如果您替换std::vector与std::initializer_list,调用有效

c++ - 通用引用和 std::initializer_list

在他的“C++和超越2012:通用引用”演示文稿中,Scott反复强调了这一点,通用引用处理/绑定(bind)到所有内容,因此重载已经采用通用引用参数的函数确实没有意义。我没有理由怀疑这一点,直到我将它们与std::initializer_list混合在一起。这是一个简短的例子:#include#includeusingnamespacestd;templatevoidfoo(T&&){coutvoidfoo(initializer_list){coutvoidgoo(T&&){coutvoidgoo(initializer_listconst&){cout奇怪的是,VC11Nov20

c++ - 为什么枚举值的 initializer_list 不被视为常量表达式?

在以下代码中(在本地和Wandbox上测试):#includeenumTypes{A,B,C,D};voidprint(std::initializer_listtypes){for(autotype:types){std::coutMSVC15.8.5编译失败:errorC2131:expressiondidnotevaluatetoaconstantnote:failurewascausedbyareadofavariableoutsideitslifetimenote:seeusageof'$S1'(均指包含constexpr的行)Clang8(HEAD)报告:error:con

c++ - 为什么 `initializer_list<pair>` 和 `initializer_list<tuple>` 的行为不同?

以下代码编译并运行:#include#include#include#includevoidext(std::initializer_list>>myList){//Dosomething}///////////////////////////////////////////////////////////intmain(void){ext({{1.0,{2.0,3.0,4.0}}});return0;}虽然这个没有:#include#include#include#includevoidext(std::initializer_list>>myList){//Dosomething}

c++ - C++ 中 std::is_trivially_copy_constructible 中的琐碎操作是什么

这是std::is_copy_constructible(1)和std::is_trivially_copy_constructible文档的摘录(2)关于cppreference.com:1)CheckswhetheratypeisCopyConstructible,i.e.hasanaccessibleexplicitorimplicitcopyconstructor.Iftherequirementismet,amemberconstantvalueequaltrueisprovided,otherwisevalueisfalse.2)Sameas(1),butthecopyco