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

时间:2010-04-14 15:42:59

标签: c++ gcc visual-studio-2010 language-features c++11

随着VS 2010的正式发布,我可以安全地在新代码中使用部分实现的C ++ 0x功能集吗?

我现在感兴趣的功能都是由VC ++ 2010和最新版本的GCC实现的。这是我 支持的唯一两个。

就第一句中提到的“安全性”而言:我可以开始使用这些功能(例如,lambda函数),并且仍然保证我的代码将在10年内在适当符合C ++的编译器上编译0x正式发布时?

我想我在问VC ++ 2010或GCC是否有可能像VC ++ 6一样结束;它是在语言正式标准化之前发布的,因此允许编译严重错误的代码。

毕竟,微软确实说过“10是新的6”。 ;)

6 个答案:

答案 0 :(得分:14)

我已经发现的一些项目没有写入标准。例如,这不起作用:



struct test {
  int operator()(int);
};

std::cout << typeid( std::result_of<test(int)>::type ).name() << std::endl;

根据维基百科网站上的C ++ 0x它应该。显然VS2010使用了result_of的TR1定义,这与C ++ 0x将具有的不同(基于decltype)。

此外,这不起作用:



std::bind<int>([](int i)->int {return i; });

失败是因为调用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)
{
 ...
}

您还会在我上面链接的页面中注意到,我已经与开发团队成员(或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 (*)()

另外......根据一些关于decltype和result_of的电子邮件交流,这应该有效:



std::result_of< decltype(f)() >::type x = f();

使用decltype的自制的std :: result_of版本,如果decltype(f)()表达式正常工作,这将有效。它不是。关于函数返回函数的一些错误。你必须使用“decltype(&amp; f)()”来使表达式有效。

所以,当然......我们正在使用它。虽然有一些错误和垃圾。好处超过等待恕我直言。当标准出来时,不要指望你的代码是标准的,未来的MS编译器可能会破坏它。

答案 1 :(得分:11)

C ++ 0X功能集现在已经很好用了,所以我想说吧。根据维基百科,该提案的最终草案应为done in august

很多东西都可以通过boost获得(实际上,很多0X来自提升) - 见boost TR1。即使编译器不完全是C ++ 0X,也可以通过boost重用这些功能。

答案 2 :(得分:1)

许多重要的事情(即你经常会经常使用的东西)几乎都是一成不变的。我认为编写非标准代码的风险非常低,特别是如果你坚持使用当前编译器上实现的规范的一部分。

有关列出功能支持的好表,请转到here。个人auto变量,r值引用和lambdas几乎是使用的重要功能,并得到很好的支持。

答案 3 :(得分:0)

  

我想我在问VC ++ 2010或GCC是否有可能像VC ++ 6一样结束;它是在语言正式标准化之前发布的,因此允许编译严重错误的代码。

有可能发生,但非常不可能,恕我直言。不仅MS,而且其他编译器供应商也已经支持一些C ++ 0x功能,我希望标准委员会在这一点上非常谨慎地打破兼容性。

答案 4 :(得分:0)

只要您对代码无法在较旧的编译器上编译感到满意,那么您就没有任何损失,也可以利用新功能。

答案 5 :(得分:0)

如果您希望您的代码多年未被触及并且希望它能够在没有干预的情况下更改编译器,我建议您坚持使用C ++ 98/03。

然而,大多数代码都是随着时间的推移而维护的,所以我认为这不是一个重要的考虑因素。我建议使用什么使您的代码更好,并在升级编译器时计划一些工作。