VS2010对c++11的支持情况验证

目前仅仅测试工作中 使用的比较多的:

智能指针

  1. shared_ptr

    #include <memory>
    std::shared_ptr<A> a(new A);

    ----支持! 同时也支持 make_shared

  2. weak_ptr

    ----支持,毕竟这是个给shared_ptr打辅助的指针模板

  3. unique_prt

    ----支持! ,但不支持make_unique,这也正常,毕竟这是C++14的语法了。

综合来看,可以在VS2010里自有的使用智能指针了。

auto类型自推导

vector<int> v_ints;
v_ints.push_back(1);
v_ints.push_back(2);
auto it = v_ints.cbegin();

std::cout << *it <<std::endl; 

auto a = make_shared<A>();

auto b = a;

------支持!

lambda表达式

Constructs a closure: an unnamed function object capable of capturing variables in scope.

c++11中有以下三种语法:

[ captures ] ( params ) -> ret_type { body } (1)
[ captures ] ( params ) { body } (2)
[ captures ] { body } (3)

理论上都是第一种语法的简化版,根据需要使用,

闭包是带有上下文的函数。说白了,就是有状态的函数

函数是代码, 状态是一组变量 ,将代码和一组变量捆绑 (bind) , 就形成了闭包。

C++中实现闭包的三种方式

  • 重载 operator()
    因为闭包是一个函数+一个状态, 这个状态通过 隐含的 this 指针传入. 所以 闭包必然是一个函数对象. 因为成员变量就是极好的用于保存状态的工具, 因此实现 operator() 运算符重载, 该类的对象就能作为闭包使用. 默认传入的 this 指针提供了访问成员变量的途径.(事实上, lambda 和 bind 的原理都是这个.)
class MyFunctor
{
public:
    MyFunctor(float f) : round(f) {}
    int operator()(float f) { return f + round; }
private:
    float round;
};
float round = 0.5;
MyFunctor f(round);
  • lambda表达式

    float round = 0.5;
    auto f = [=](float f) { return f + round; }

? C++11里面的lambda就是闭包的实现。

  • boost::bind/std::bind

    int boost_func(float f, float round)
    { return f + round; }
    float round = 0.5;
    boost::function<int(float)> f = boost::bind(boost_func, _1, round);

closure的状态特指其运行的上下文。 closure将存贮它运行时需要的上下文,从而保证在closure创建时的上下文可以在closure运行时依然有效。

比如round就是closure的上下文。保存上下文的这一特点通常被称作“capture”或者是”bind”。 capture可以自己写,比如MyFuctor f(round); 也可以用boost::bind。

vs2010测试:

int make_i = 3;

auto f = [=](int x){
    std::cout << x << make_i << '\n';
};//这里的;不能省略

f(make_i);

------- 支持!

支持匿名表达式 ,则意味着闭包的支持,在C++里,闭包不是那么出名,毕竟这个概念是前端JS造出来的。但是清楚lambda表达式,我们可以精简代码,后面有计划补充学习记录。可以先参考这里

for_each

Possible implementation

template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
{
    for (; first != last; ++first) {
        f(*first);
    }
    return f;
}

循环遍历所有元素,使用f函数,对所有元素(迭代器)进行处理。

测试 for_each 里的lambda表达式

#include <algorithm>
for_each(v_ints.begin(),v_ints.end(),[](int val){
    cout << val << endl;
});

------ 支持!

Range-based for loop

vector<int> v_ints;
v_ints.push_back(1);
v_ints.push_back(2);

for (const int& i : v_ints) // access by const reference
    std::cout << i << ' ';
std::cout << '\n';

编译出错。

----不支持 !

正则表达式

测试:

std::string fnamesstring[] = {"foo.txt", "bar.txt", "baz.dat", "zoidberg"};
vector<string> fnames(fnamesstring,fnamesstring+4);
std::regex txt_regex("[a-z]+\\.txt");

for_each(fnames.begin(),fnames.end(),[&](const string &fname){
    std::cout << fname << ": " << std::regex_match(fname, txt_regex) << '\n';
}  );

-------支持!

bind函数模板

The function template bind generates a forwarding call wrapper for f. Calling this wrapper is equivalent to invoking f with some of its arguments bound to args.

---- 函数模板绑定为f生成一个转发调用包装器。调用这个包装器等价于调用f并将它的一些参数绑定到args。(机器翻译很感人)

个人理解,bind函数模板,可以更大范围的使用某些函数,比如嵌套绑定 子表达式函数,绑定类成员函数,甚至类的成员变量。

验证代码:

#include <functional>
void f(int n1 ,int n2,int n3 ,int n4 ,int n5){
    cout << n1 <<" "<< n2 <<" "<<n3 <<" "<<n4<<" "<<n5<<'\n';
}

using namespace std::placeholders;

void f(int n1 ,int n2,int n3 ,int n4 ,int n5);

auto b = bind(f,2,_1,_2,4,5);
b(100,200);

-------支持!

其他

vector<int> v_ints = {1,2,3,4,5,6,2,4,3};vs2010不支持这样初始化

可行的修改方案:

int ints[] = {1,2,3,4,5,6,2,4,3};
vector<int> v_ints(ints,ints+9);

原文地址:https://www.cnblogs.com/Stultz-Lee/p/10036207.html

时间: 2024-10-26 12:27:15

VS2010对c++11的支持情况验证的相关文章

VS2010编译器工具cl对c++11标准支持情况测试

本文探讨了VS2010编译工具cl对C++11标准的支持情况,提供了利用C++11新特性的两段代码来进行测试,并同g++ 4.9.3编译器的编译情况相对比.总的说来:VS2010的编译器工具cl部分支持了C++11标准,而g++ 4.9.3则全部支持C++11标准.虽然现在已出现了C++14等新的标准,但熟悉了C++11标准的支持情况有利于我们正确选用符合自己需要的编译工具. 1. 问题产生 一个月前由于编写算法的而使用C++语言,看了一些英文版的算法设计和分析书.一个偶然的机会发现了C++11

目前主流编译器对C++11特性的支持情况

1. GCC编译器(从编译器GCC4.8.X的版本完全支持) (1)目前C++11特性,之前成为C++0X特性,从GCC4.3的后续版本中逐步对C++11进行支持. (2)从官方信息可以看到,目前从完全对C++11特性进行支持的是从编译器GCC4.8.X的版本. 参考网址:https://gcc.gnu.org/projects/cxx-status.html#cxx11 2. Clang编译器 Clang 是一个 C++ 编写.基于 LLVM.发布于 LLVM BSD 许可证下的 C/C++/

RDO远程连接时提示“远程计算机需要网络级别身份验证,而您的计算机不支持该验证,请联系您的系统管理员或者技术人员来获得帮助”

当服务器重装操作系统后使用RDO远程连接时会出现错误提示"远程计算机需要网络级别身份验证,而您的计算机不支持该验证,请联系您的系统管理员或者技术人员来获得帮助" 如下图所示 原因是服务器版操作系统提高了安全级别,使用了网络级别的身份验证信息.RDO模拟的是WinXP系统的远程连接,安全系数较低.所以会出现在同一个win764旗舰版机器上使用系统自带的远程桌面能连接,但使用RDO就连接不上去的情况. 解决方法如下:  第一步: 使用系统自带的远程桌面(mstsc.exe)连接服务器, 运

jquery.validata1.11怎么支持metadata

使用metadata方式这个需要使用jquery.metadata.js插件才可工作,通过在表单项中定义特殊的属性来指定验证规则 但是我发现最新的jquery.validate 1.11竟然没有内置metadata的支持,故需要对其进行一些改造 搜索jquery.validate.js文件中的$.validator.classRules(element),并在其前加入以下行: $.validator.metadataRules(element), 再搜索 staticRules:, 在其前面加入

C++11标准 STL正则表达式 验证电子邮件地址

转自:http://www.cnblogs.com/yejianfei/archive/2012/10/07/2713715.html 我们最经常遇到的验证,就是电子邮件地址验证.网站上常见.各种网页脚本也都常用“正则表达式”(regular expression)对我们输入的电子邮件地址进行验证,判断是否合法.有的还能分解出用户名和域名.现在用C++语言实现一下电子邮件地址验证程序,用的是C++ 11标准新增加的STL正则表达式. 源代码如下,该代码已在Visual Studio 2010上验

【翻译自mos文章】Oracle Audit Vault 和Database Firewall 12.x 的平台支持情况

Oracle Audit Vault 和Database Firewall 12.x 的平台支持情况 来源于: Oracle Audit Vault and Database Firewall 12.x Platform Support (文档 ID 1536380.1) 适用于: Oracle Audit Vault and Database Firewall - Version 12.1.0.0 and later Information in this document applies t

ECMAScript5和ECMAScript6_浏览器支持情况

ECMAScript5浏览器支持情况: Opera 11.60 Internet Explorer 9* Firefox 4 Safari 5.1** Chrome 13 * IE9不支持严格模式 - IE10 添加 ** Safari 5.1 仍不支持 Function.prototype.bind, 尽管 Function.prototype.bind现在已经被Webkit所支持. 具体支持情况可以查看 http://kangax.github.io/compat-table/es5/ (E

远程连接时提示“远程计算机需要网络级别身份验证,而您的计算机不支持该验证,请联系您的系统管理员或者技术人员来获得帮助”

当服务器重装操作系统后使用RDO远程连接时会出现错误提示"远程计算机需要网络级别身份验证,而您的计算机不支持该验证,请联系您的系统管理员或者技术人员来获得帮助" 如下图所示 原因是服务器版操作系统提高了安全级别,使用了网络级别的身份验证信息.RDO模拟的是WinXP系统的远程连接,安全系数较低.所以会出现在同一个win764旗舰版机器上使用系统自带的远程桌面能连接,但使用RDO就连接不上去的情况. 解决方法如下:  第一步: 使用系统自带的远程桌面(mstsc.exe)连接服务器, 运

在YouCompleteMe+Syntastic中添加和取消对C++11的支持

添加对c++11的支持: /.vimrc中添加: let g:syntastic_cpp_compiler = 'g++'  "change the compiler to g++ to support c++11. let g:syntastic_cpp_compiler_options = '-std=c++11 -stdlib=libc++' "set the options of g++ to suport c++11..ycm_extra_conf.py中: 将flags数组