草庐IT

definition-lists

全部标签

c++ - 为什么双空花括号 { { } } 创建一个带有一个元素而不是零的 std::initializer_list<double> ?

我有以下构造函数:MyItem(std::initializer_listl){std::cout后面用双花括号调用:MyItem{{}}l.size()给出的结果是1。这种行为背后的机制是什么?似乎嵌套的{}就像唯一元素的默认构造函数一样,但我不太明白为什么以及如何在这里进行类型推导。 最佳答案 当你使用大括号(list-initialization)初始化MyItem对象时,你展示的list构造函数非常贪心。这些将传递一个空列表:MyItemfoo({});MyItemfoo{std::initializer_list{}};这

c++ - 将 std::list<std::unique_ptr> 移动到 vector 中尝试引用已删除的函数

这是一个完整的程序,可以重现我的问题。#include#include#include#includeintmain(){std::vector>>v;std::list>l;l.push_back(std::make_unique(0));l.push_back(std::make_unique(1));v.push_back(std::move(l));//error}在最后一行,编译器提示std::unique_ptr的deleted复制构造函数被引用。由于我将列表移动到vector中,我假设不会对列表的元素调用任何复制构造函数。为什么会这样?我将如何解决它?我正在使用MSVC2

c++ - 将 std::list<std::unique_ptr> 移动到 vector 中尝试引用已删除的函数

这是一个完整的程序,可以重现我的问题。#include#include#include#includeintmain(){std::vector>>v;std::list>l;l.push_back(std::make_unique(0));l.push_back(std::make_unique(1));v.push_back(std::move(l));//error}在最后一行,编译器提示std::unique_ptr的deleted复制构造函数被引用。由于我将列表移动到vector中,我假设不会对列表的元素调用任何复制构造函数。为什么会这样?我将如何解决它?我正在使用MSVC2

c++ - 在 C++ 中编写复制构造函数和赋值运算符的 list

请列出复制构造函数和赋值运算符在C++中需要执行的任务,以保持异常安全、避免内存泄漏等。 最佳答案 首先确定您确实需要支持拷贝。大多数情况下并非如此,因此禁用两者是可行的方法。有时,您仍需要从多态层次结构中提供对类的复制,在这种情况下:禁用赋值运算符,编写(protected?)复制构造函数,并提供虚拟clone()函数。否则,如果您正在编写一个值类,您将回到Coplien的正交规范形式的领域。如果您有一个无法简单复制的成员,则需要提供一个复制构造函数、一个析构函数、一个赋值运算符和一个默认构造函数。此规则可以细化,例如:TheLa

c++ - 在 C++ 中编写复制构造函数和赋值运算符的 list

请列出复制构造函数和赋值运算符在C++中需要执行的任务,以保持异常安全、避免内存泄漏等。 最佳答案 首先确定您确实需要支持拷贝。大多数情况下并非如此,因此禁用两者是可行的方法。有时,您仍需要从多态层次结构中提供对类的复制,在这种情况下:禁用赋值运算符,编写(protected?)复制构造函数,并提供虚拟clone()函数。否则,如果您正在编写一个值类,您将回到Coplien的正交规范形式的领域。如果您有一个无法简单复制的成员,则需要提供一个复制构造函数、一个析构函数、一个赋值运算符和一个默认构造函数。此规则可以细化,例如:TheLa

c++ - < : cannot begin a template argument list

我得到一个错误templateclassSomeClass;classClass;SomeClass*cls; 最佳答案 根据MaximalMunchtokenizationprinciple有效的C++token必须收集/具有尽可能多的连续字符。是digraph(符号[的另一种表示形式)。DigraphEquivalent]}%:#所以SomeClass*cls;被解释为SomeClass[:Class>*cls;这没有任何意义。解决方案:在之间添加一个空格和:SomeClass*cls;^|WhiteSpace

c++ - < : cannot begin a template argument list

我得到一个错误templateclassSomeClass;classClass;SomeClass*cls; 最佳答案 根据MaximalMunchtokenizationprinciple有效的C++token必须收集/具有尽可能多的连续字符。是digraph(符号[的另一种表示形式)。DigraphEquivalent]}%:#所以SomeClass*cls;被解释为SomeClass[:Class>*cls;这没有任何意义。解决方案:在之间添加一个空格和:SomeClass*cls;^|WhiteSpace

c++ - 没有 O(1) 操作来连接来自两个 forward_lists 的元素?

在阅读C++11和N2543的FCD中的forward_list时我偶然发现了一个特定的splice_after重载(稍微简化,让cit为const_iterator):voidsplice_after(citpos,forward_list&x,citfirst,citlast);行为是在pos之后(first,last)之间的所有内容都移动到this。因此:this:123456x:111213141516^pos^first^lastwillbecome:this:1213143456x:11121516^pos^first^last描述包括复杂性:Complexity:O(di

c++ - 没有 O(1) 操作来连接来自两个 forward_lists 的元素?

在阅读C++11和N2543的FCD中的forward_list时我偶然发现了一个特定的splice_after重载(稍微简化,让cit为const_iterator):voidsplice_after(citpos,forward_list&x,citfirst,citlast);行为是在pos之后(first,last)之间的所有内容都移动到this。因此:this:123456x:111213141516^pos^first^lastwillbecome:this:1213143456x:11121516^pos^first^last描述包括复杂性:Complexity:O(di

c++ - 我可以忽略 gcc 警告 : ‘Foo::m_bar’ should be initialized in the member initialization list [-Weffc++]

structBar{Bar(){}};structFoo{Foo()=default;Barm_bar;};intmain(){Foofoo;}当使用C++11default关键字和gcc警告-Weffc++时,gcc输出:warning:‘Foo::m_bar’shouldbeinitializedinthememberinitializationlist[-Weffc++]忽略此警告是否安全?我应该向gcc提交错误吗? 最佳答案 您可以忽略或抑制警告。这是对有效C++指南之一的误解。该指南说更喜欢初始化而不是赋值,但在您的示例中