相关疑难解决方法(0)

为什么从C++ 11中删除了std :: pow(double,int)?

在研究计算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)版本提供了一个很好的优化机会,所以它们被删除似乎很奇怪.编译器是否仍然符合标准以提供这样的优化过载?

c++ c++-standard-library c++11

63
推荐指数
1
解决办法
1万
查看次数

2参数函数的重载分辨率不正确

我们来看下面的示例程序:

#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参数函数.同样在较大的项目中它也适用于 …

c++ overload-resolution visual-studio-2012

9
推荐指数
1
解决办法
498
查看次数