我现在应该使用C++ 0x功能吗?

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编译器可能会破坏它.


Jor*_*ans 11

C++ 0X功能集现在已经很好用了,所以我想说吧.根据维基百科,该提案的最终草案应该在八月份完成.

无论如何,很多东西都可以通过boost获得(实际上,很多0X都来自boost) - 请参阅boost TR1.即使编译器不是完全C++ 0X,您也可以通过boost重用这些功能.