svu*_*u2g 22 c++ language-features gcc visual-studio-2010 c++11
随着VS 2010的正式发布,在我的新代码中开始使用部分实现的C++ 0x功能集是否安全?
我现在感兴趣的功能都是由VC++ 2010和最新版本的GCC实现的.这是我必须支持的两个.
就第一句中提到的"安全性"而言:我可以开始使用这些功能(例如,lambda函数),并且仍然可以保证我的代码将在10年内编译成适当符合C++ 0x的编译器.正式发布?
我想我在问VC++ 2010或GCC是否有可能最终像VC++ 6一样; 它是在语言正式标准化之前发布的,因此允许编译严重错误的代码.
毕竟,微软确实说"10是新的6".;)
Edw*_*nge 14
我已经发现了几个没有写入标准的项目.例如,这不起作用:
struct test {
int operator()(int);
};
std::cout << typeid( std::result_of<test(int)>::type ).name() << std::endl;
Run Code Online (Sandbox Code Playgroud)
根据维基百科网站上的C++ 0x它应该.显然VS2010使用了result_of的TR1定义,这与C++ 0x将具有的不同(基于decltype).
此外,这不起作用:
std::bind<int>([](int i)->int {return i; });
Run Code Online (Sandbox Code Playgroud)
它失败是因为调用std :: result_of(以及它的实现)失败,因为lambda类型没有result_of typedef.这当然是为什么你提供返回类型到绑定调用,但显然它由于某种原因忽略它并继续自己搜索.bind的boost版本按预期工作.出于这个原因,我们将继续在我们的项目中使用bind的boost版本.
另外,如果您将在http://blogs.msdn.com/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx?CommentPosted=上注明true#commentmessage VS2010尚未实现一些会影响lambda表达式的更改.我无法打破它们,但后来我没有使用嵌套的lambda,也许永远不会.
您还应该记住boost :: shared_ptr和std :: shared_ptr是不兼容的.这并不奇怪,但如果你打算使用其中一种,你必须知道这一点......我建议不要两者兼而有之,我们只是坚持使用提升.
VS2010也没有下降.虽然容易做到:
template < typename T > T&& declval();
使用示例:
template < typename T >
struct point
{
T x,y;
};
template < typename T1, typename T2 >
point<decltype(declval<T1>() + declval<T2>())> operator + (point<T1> const& lh, point<T2> const& rh)
{
...
}
Run Code Online (Sandbox Code Playgroud)
您还会在我上面链接的页面中注意到,我已经与开发团队成员(或PR部分或其他)讨论过decltype中存在错误.不仅仅是我提到的那个,所以我将展示两者:
template < typename T1, typename T2 >
auto operator + (point<T1> const& lh, point<T2> const& rh)
-> point<decltype(lh.x + rh.x)>
{
...
}
point<int> x; point<double> y;
point<double> pt = x + y; // fails, operator + returned point<const double>
void f();
auto ptr = &f;
std::cout << typeid( decltype(*ptr) ).name() << std::endl;
std::cout << typeid( decltype(*&f) ).name() << std::endl; // should output the same thing...outputs void (*)()
Run Code Online (Sandbox Code Playgroud)
另外......根据一些关于decltype和result_of的电子邮件交流,这应该有效:
std::result_of< decltype(f)() >::type x = f();
Run Code Online (Sandbox Code Playgroud)
使用我的家庭酿造版本的std :: result_of使用decltype,如果decltype(f)()表达式正常工作,这将有效.它不是.关于函数返回函数的一些错误.你必须使用"decltype(&f)()"来使表达式起作用.
所以,当然......我们正在使用它.虽然有一些错误和垃圾.好处超过等待恕我直言.当标准出来时,不要指望您的代码是标准的,未来的MS编译器可能会破坏它.