std::bind能在编译时进行类型检查吗?

3

有没有可能对std::bind给出的参数进行静态类型检查? 我很想使用它,但它几乎接受任何内容。例如,std::bind(1,2);被接受。或者,我可以使用std::result_of来实现自己的解决方案。


1
我得到了这个错误:'bind(int, int)'没有匹配的函数调用,你确定你正在使用正确的实现吗?很多东西直到它的 'op()' 实际被使用(因为它使用模板)才会被检查。但它不应该接受一个普通函数调用不接受的东西。 - PlasmaHH
@PlasmaHH:你使用的是哪个实现?GCC 4.5.1和libc++ TOT都支持这个。 - Xeo
我正在使用GCC 4.5.3。auto qq = std::bind(1,2);没有给我任何错误。 - user2023370
@Xeo:对于C++11的特性,我总是使用一些最近的svn快照。但至少在gcc 4.6上调用x()之后会出错。当使用C++11时,使用旧版本的gcc(如4.5)从来不是一个好主意。 - PlasmaHH
1
@PlasmaHH:函数调用运算符出错是可以预料的。然而,bind本身应该已经失败了。看起来GCC 4.7的libstdc++正确地使用SFINAE,如果bind的参数不可调用,则会被排除在外。 - Xeo
1个回答

2

我还不确定bind是否可以可靠地拒绝这种结构。但如果可以的话,那么这将是一种扩展。

标准中的Requires子句告诉客户端为避免未定义的行为应该做什么。它没有告诉供应商要符合什么要求。所以std::bind(1,2)是未定义的行为,它可能会做任何事情。引起编译时错误会是一种好的未定义行为,但并不是必需的。


哦!知道了,我原来以为“Require”是指实现的要求。 - Xeo
@Howard Hinnant:看起来GCC 4.7.0(20120128)现在拒绝了std::bind(1,2);尽管它也接受带有太少参数的函数(虽然零个参数会报错)。正如您所描述的,一个编译器供应商可能会以一种方式定义bind,而另一个则以另一种方式定义。谢谢。 - user2023370

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接