VS2013에서 GGC 4.9 및 Clang 3.5 (libC++ 사용)의 일부 코드를 이식 할 때 컴파일 오류가 발생했습니다. 코드의 요점은 내가 cmath의 isfinite
연료 소모량이 형식을 반환로 선언이 때문에 isfinite
호출이 컴파일되지 않습니다 생각SFINAE std :: isfinite 및 유사한 기능을 사용하여 std :: is_arithmetic
#include <cmath>
struct Foo
{
operator double() const { return(101.0); } // Implicit conversion to double
};
int main(int, char**)
{
Foo foo;
std::exp(foo); // Compiles
std::isfinite(foo); // Does not
return(0);
}
입니다 :
typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
및 Foo
이 is_arithmetic
하지 않기 때문에, isfinite
이 제거됩니다 과부하 세트로부터. 같은 친구의 isfinite
isnan
같은 사실입니다. 그래서 내 질문은 이것이 예상되는지 여부입니다.
표준에서는 isfinite
과 같은 함수의 인수가 실제로 직접 double
또는 float
과 같이 암시 적으로 변환 가능하도록 요구합니까?
또한 std::is_arithmetic
이 아닌 이유는 무엇입니까? std::is_floating_point
이 아니며 is_arithmetic
은 isfinite
을 정수로 나타냅니다.
추가 질문으로 제약 조건을 지정하는 가장 좋은 방법은 입니다. is_convertible_to_floating_point?
C++ 11 ['std :: exp'] (http://en.cppreference.com/w/cpp/numeric/math/exp)도 부동 소수점 유형뿐만 아니라 정수형도 허용합니다. –
그리고 문제를 해결하기 위해 ['std :: is_arithmetic'] (http://en.cppreference.com/w/cpp/types/is_arithmetic)의 특수화를 클래스에 쉽게 추가 할 수 있습니다. –
@JoachimPileborg 불가능합니다. 표준 라이브러리 유형 특성 ('std :: common_type' 제외)을 전문으로하는 것은 UB입니다. –