草庐IT

c++ - 是否可以在 C++11/14 语法中编写一个 lambda 函数来查看父变量?

抽象地说:inti=1;autogo=[](){returni;};有没有可能用现代C++语法做类似的东西? 最佳答案 正式地说,访问周围上下文的能力是函数(不能)和闭包(可以)之间的关键区别。根据环境的捕获语言,可能通过复制或引用发生。在C++11(及更高版本)中,lambda是闭包,并且与C++一样,我们有一种细粒度的方式来指定如何完成捕获:通过复制:隐式[=](){returni;}或显式[i](){returni;}通过引用:隐式[&](){returni;}或显式[&i](){returni;}C++14甚至引入了广义的l

c++ - 将两个 char* 带入另一个 std::string 的字符串构造函数在 c++14 中有效,但在 c++17 中无效

以下程序尝试使用第一个字符串和指向第一个字符串中间的指针构造第二个字符串:#includeintmain(){std::stringsrc="helloworld";constchar*end=&src[5];std::stringdest(src.data(),end);}在C++14及更早版本中,这有效。但是inC++17thecallfails:error:nomatchingfunctionforcallto‘std::__cxx11::basic_string::basic_string(char*,constchar*&)’std::stringdest(src.data(

c++ - GCC 二进制文字和 C++14 的区别?

C++14似乎即将到来,编译器已经在尝试实现这个新版本的核心特性。我在看GCCsupportforthesecorefeatures并注意到有关二进制文字部分的一些信息:GCC实现了它们,但似乎在GNU二进制文字和C++14二进制文字之间有所不同。以下是两者各自的引用:GNUbinaryliteralsC++1ybinaryliterals我试图找到它们两者之间的一些差异,因为GCC似乎有所作为,但找不到任何东西。你们有谁知道更多关于可能的不兼容性的信息吗? 最佳答案 来自commitdiff它在gcc4.9中引入了支持,唯一的区别

c++ - 为什么我不能在 C++14 的 lambda 中 move std::unique_ptr?

我想在lambda中传递一个原始指针,但如果未调用lambda,我不希望它被泄露。它看起来像这样:voidClean(std::unique_ptr&&list);voidf(int*list){thread_pool.Push([list=std::unique_ptr(list)]{Clean(std::move(list));//我在Clang3.7.0中遇到错误:error:bindingofreferencetotype'unique_ptr'toavalueoftype'unique_ptr'dropsqualifiers但我一开始没有看到任何限定词,尤其是被丢弃了。另外,

c++ - const 迭代器在 C++14 中仍然是邪恶的吗

ScottMayers的“EffectiveSTL”中的第26项被标记为“Preferiteratortoconst_iterator,reverse_iterator和constreverseiterator”。原因是insert()和erase()的某些形式完全需要iterator并且从其他类型转换是乏味的并且容易出错。此外,比较iterator和const_iterator可能会出现问题,具体取决于STL实现。这本书出版于2001年。第26条中的建议在gcc的当前状态下是否仍然有效? 最佳答案 C++14标准(N3936)保证

c++ - 标准 C++14 委员会草案是否公开?

AsoflastSaturday...ThisafternooninBristol,UK,theISOC++standardscommitteeadoptedgenericlambdas,dynamicarrays(animprovedversionofC99VLAs),variabletemplates,reader/writerlocks,make_unique,optional,standardlibraryuser-definedliterals,andanumberofotherlanguageandlibraryimprovements–andapprovedtheresu

c++ - 为什么默认情况下全局命名空间中没有 C++14 标准定义的文字?

C++14包括标准定义的文字,除其他外,std::string以及来自的各种时间跨度标题。要使用它们,您必须说usingnamespacestd::literals;(或一些变化,具体取决于您想要的文字,因为它们位于各种内联命名空间中)。这一切都很好,但我很好奇为什么using需要声明。没有前导下划线的UDL是为实现保留的,因此不可能"helloworld"s在符合标准的程序中可能意味着其他任何东西。那么为什么不是#include足以将文字转换功能纳入范围?为什么必须显式包含字面量命名空间?编辑:N3531是我能找到的最新版本的提案——不幸的是,它没有讨论将事物放入命名空间的动机,而只

c++ - 在 C++14 中,在哪个范围内声明了重新声明的枚举的无范围枚举数?

C++14(准确地说,N4296)在7.2:11中提到了枚举:Eachenum-nameandeachunscopedenumeratorisdeclaredinthescopethatimmediatelycontainstheenum-specifier.现在,如果命名空间N包含枚举E的不透明枚举声明,然后该枚举完全从全局命名空间声明,会发生什么?我们应该在全局命名空间中,还是在命名空间N中找到它的枚举数?当然,为了不透明地声明一个无范围的枚举,它应该有一个固定的底层类型。考虑以下代码。namespaceN{enumE:int;}enumN::E:int{A,B};namespac

c++ - 为什么在c++14中定义了shared_timed_mutex,而在c++17中定义了shared_mutex?

C++11引入了std::mutex及其扩展版本-std::timed_mutex。但是,在c++14中,我们有std::shared_timed_mutex,但它的“父级”std::shared_mutex将在c+中添加+17。对此有什么合理的解释吗?如果我不打算使用std::shared_timed_mutex的“定时”功能,它会比建议的std::shared_mutex更糟(更慢,消耗更多资源)吗?? 最佳答案 Sharedmutex原来是有计时的,叫做shared_mutex。实现者(msvciirc)指出,他们可以在没有时

c++ - std::optional 从方法返回可选值的最佳替代方案? (使用 C++98/C++11/C++14)

显然,std::optional如果使用C++17或boost(另见GOTW#90),是从函数返回可选值的最佳选择std::optionalpossiblyFailingCalculation()但是,如果一个人被旧版本卡住(并且不能使用boost),那么最好的选择是什么?为什么?我看到了几个选项:STL智能指针(仅限C++11)std::unique_ptrpossiblyFailingCalculation();(+)与可选的用法几乎相同(-)对非多态类型或内置类型的智能指针感到困惑与bool配对std::pairpossiblyFailingCalculation();旧式boo