草庐IT

C++ 11新特性之语法甜点2

概述        C++11中引入了许多简化编程工作的语法上的新特性,我们暂且美其名曰:“语法甜点”。书接上篇,我们继续介绍C++11中的这些“语法甜点”,也是第二篇关于“语法甜点”的文章。语法甜点6:模板右边双括号        在C++03中,vector>vctTemp是一个非法的表达式,编译器会认为右边的>>是一个移位操作符,因此必须修改为:vector>vctTemp,即在右边的两个>中间添加一个空格。在C++11中,这将不再是一个问题,编译器将能够识别出右边的双括号是两个模板参数列表的结尾。语法甜点7:static_assert        静态断言static_assert由

python - 如何使用 pybind11 包装模板类

我有一个类似于下面的类结构,其中我有两个类型A和B,它们具有相似的签名,只是参数/返回类型不同。然后我使用一个类模板来处理这两个类,在Python中实现ducktyping的静态变体。现在我想使用pybind11将此代码包装到Python中,我希望在其中使用标准的动态ducktyping获得一个采用两种类型的类。我该怎么做?我基本上是在寻找一种方法来禁用pybind11中的严格类型检查或指定多种类型以便同时接受TypeA和TypeB。下面示例的定义方式,只有TypeA通过检查。由于函数签名不同,我也无法将A和B统一为一个基类。#include#includeclassTypeA{pub

c++ - C++11 是否允许 vector<const T>?

容器要求已从C++03更改为C++11。虽然C++03有全面的要求(例如vector的复制构造性和可赋值性),但C++11定义了每个容器操作的细粒度要求(第23.2节)。因此,您可以例如将可复制构造但不可赋值的类型(例如具有const成员的结构)存储在vector中,只要您只执行某些不需要赋值的操作(构造和push_back就是这样的操作;insert不是)。我想知道的是:这是否意味着标准现在允许vector?我看不出有什么理由不应该-constT,就像具有const成员的结构一样,是一种可复制构造但不可分配的类型-但我可能错过了一些东西。(部分让我觉得我可能遗漏了一些东西的原因是,如

c++ - 使用数组作为元组成员 : Valid C++11 tuple declaration?

下面的代码可以在G++4.7.2中正常编译:#includestd::tuplex;但是,使用clang++3.2会产生以下错误:错误:数组初始化器必须是一个初始化器列表。如果我从元组声明中删除float类型,错误就会消失。上面的元组声明是否有效?($CXX-std=c++11-c文件.cpp) 最佳答案 我认为标准中没有任何内容禁止您的声明。但是,一旦尝试初始化、复制、移动或分配元组,就会遇到问题,因为对于这些操作,元组的所有成员类型都必须能够用作初始化器、可复制构造、可复制分配和移动分配,分别(§20.4.2.1)。这些都不是数

c++ - C++11 的 Vim 语法高亮显示不会混淆其他高亮显示。例如,类/命名空间范围

我知道这个脚本:http://www.vim.org/scripts/script.php?script_id=3797.它已经被提出过几次,关于Vim的C++11语法的其他问题由于重复这个问题而被关闭:IsthereaC++11syntaxfileforvim?.不幸的是,建议的脚本导致作用域结构(例如“namespace::member()”)不再突出显示,和函数和类名称不再突出显示。现在有没有人有更好的VimC++11插件?理想情况下,保留常规C++插件的所有功能,标记新关键字/保留字(例如nullptr),lambda表达式/通用初始化语法不标记为错误。等等等等

c++ - 将 C++11 枚举类作为模板传递,同时自动推导其类型

这个最小的例子在没有警告的情况下编译并运行://librarytemplatestructlibrary_struct{};//userenumclassmy_enum{x,y,z};intmain(){library_structunused;//l.7(void)unused;return0;}现在,我希望编译器从枚举模板参数my_enum::x中推导出类型模板参数my_enum。这看起来会好得多:library_structunused;我见过编译器能够推导出模板参数的例子,但我只被允许省略模板参数列表中的最后一个模板参数。那么这里是否可以省略枚举类型呢?编辑:我对没有宏的解决方

c++ - C++11 <codecvt> header 在最新的 GCC 中可用吗?

看完Isnotastandardheader?我不确定该怎么做,因为我的Windows版本的代码库使用在宽字符串和字符串之间进行转换。我目前在我的代码的Linux版本中使用GCC4.7。是在最新的GCC中也丢失了吗?有什么解决方法?顺便说一句,正如它所说的here以下代码不适用于GCC:wstringws=L"hello";stringns(ws.begin(),ws.end()); 最佳答案 使用mbsrtowcs和wcsrtombs怎么样?尽管它们来自C,但与std::string和std::wstring一起使用不是很方便(但

c++ - 使用 _GLIBCXX_CXX11_ABI 来使用具有 C++ 11/14 功能的 pre-5.1 C++ ABI 有什么影响?

来自themanual:IntheGCC5.1releaselibstdc++introducedanewlibraryABIthatincludesnewimplementationsofstd::stringandstd::list.Thesechangeswerenecessarytoconformtothe2011C++standardwhichforbidsCopy-On-Writestringsandrequiresliststokeeptrackoftheirsize.可以使用_GLIBCXX_USE_CXX11_ABI宏来控制库header是使用旧ABI还是新ABI,而

c++ - 字符串文字连接的正确行为(C++11 翻译的第 6 阶段)

我很确定VisualC++2015在这里有一个错误,但我不能100%确定。代码://Encoding:UTF-8withBOM(requiredbyVisualC++).#includeautomain()->int{autoconsts=L"""?isnotintheUnicodeBMP!";returns[0]>256?EXIT_SUCCESS:EXIT_FAILURE;}使用g++的结果:[H:\scratchpad\simple_text_io]>g++--version|find"++"g++(i686-win32-dwarf-rev1,BuiltbyMinGW-W64pro

c++ - Boost.Phoenix 是否天生就比等效的 C++11 lambda 慢(它是否使用虚拟调用、 'volatile' 用法等)?

我一直认为Boost.Phoenix使用类型推断来静态推断所有内容,直到我尝试了这段代码:#include#includeusingnamespaceboost::phoenix;usingnamespaceboost::phoenix::placeholders;structFoo{intx;};intmain(){std::vectorbar;bind(&Foo::x,ref(bar)[_1])("invalidindex");//oopsreturn0;}并得到警告:warningC4239:nonstandardextensionused:'argument':conversi