在研究计算p ^ q(指数)的有效方法时,其中q是一个整数并且回顾了C++ 98和C++ 11标准,我注意到std::pow(double, int)
在C++ 11 中显然已经消除了重载.
在C++ 98 26.5/6中它有double pow(double, int);
签名.
在C++ 11 26.8所有我能找到的是重载采取一对float
,double
或者long double
和一个明确的注意,在参数类型积分和双重的混合物的情况下,在pow(double, double)
过载应挑选.
这只是对前一个意图的澄清,如果它们在C++ 98中被错误地添加了,它们是否真的在C++ 11中删除了,还是别的?
显然,该pow(double, int)
版本提供了一个很好的优化机会,所以它们被删除似乎很奇怪.编译器是否仍然符合标准以提供这样的优化过载?
我们来看下面的示例程序:
#include <cmath>
namespace half_float
{
template<typename T> struct half_expr {};
struct half : half_expr<half>
{
operator float() const;
};
template<typename T> half sin(const half_expr<T>&);
template<typename T> half atan2(const half_expr<T>&, const half_expr<T>&);
}
using namespace std;
using half_float::half;
int main()
{
half a, b;
half s = sin(a);
half t = atan2(a, b);
}
Run Code Online (Sandbox Code Playgroud)
在VS 2010中,这编译得很好(暂时忽略明显的链接器错误).但在VS 2012中,这给了我:
错误C2440:'转换':无法从'float'转换为'half_float :: half'
所以似乎重载解析不会从命名空间中选择版本half_float
(ADL应该完成),而是std
使用隐式转换来实现float
.但奇怪的是,这只发生在atan2
通话而非sin
通话中.
在较大的项目中,这个错误实际上首先发生在我身上,它也发生在其他2参数函数(或者更确切地说是那些有2个half
参数的函数)中fmod
,但不适用于任何1参数函数.同样在较大的项目中它也适用于 …