https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61795
Bug ID: 61795
Summary: [C++11] return type of std::pow(std::complex<float>,
int) should be std::complex<double>
Product: gcc
Version: 4.10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: kariya_mitsuru at hotmail dot com
With libstdc++, the return type of std::pow(std::complex<float>, int) is
std::complex<float>.
However, In C++11 mode, the return type of std::pow(std::complex<float>, int)
should be std::complex<double>.
According to C++11 standard 26.4.9[cmplx.over] paragraph 3, "if either argument
has type complex<double>, double, or an integer type, then both arguments are
effectively cast to complex<double>."
The return type of std::pow(std::complex<double>, std::complex<double>) is
std::complex<double>, So I think that std::pow(std::complex<float>, int) should
be std::complex<double> in C++11 mode.
The sample code below can show whether the return type is std::complex<double>.
================================================================================
#include <iostream>
#include <typeinfo>
#include <complex>
int main()
{
std::cout << std::boolalpha
<< (typeid(std::pow(std::complex<float>(1), 1)) ==
typeid(std::complex<double>))
<< std::endl;
}
================================================================================
cf. http://melpon.org/wandbox/permlink/zW8TWZe9kKzKWqFq
While in C++03 mode, the return type of std::pow(std::complex<float>, int)
should be std::complex<float>, I think.
Note that this problem does not occur in std::complex<double> and
std::complex<long double> because there is no difference between C++03 and
C++11.
See also: PR56106, PR57974