我已经发现有几个项目没有写入标准。例如,这是行不通的:
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。
另外,如果您在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 是不兼容的。不足为奇,但如果您打算使用其中一种,您必须知道这一点......我不建议两者都使用,我们只会坚持使用 boost。
VS2010 中也没有 declval。不过制作起来很容易:
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(&f)()”来使表达式起作用。
所以,当然……我们正在使用它。虽然有一些错误和废话。好处超过等待恕我直言。不要指望当标准出来时你的代码是标准的,未来的 MS 编译器可能会破坏它。