Рассмотрим следующий (багги) код С++:
#include <cmath>
#include <cstdlib>
#include <iostream>
int main() {
if (abs(-0.75) != 0.75) {
std::cout << "Math is broken!\n";
return 1;
} else {
return 0;
}
}
Этот код неисправен, потому что он вызывает abs
(значение ::abs
) вместо std::abs
. В зависимости от реализации ::abs
может не существовать, или это может быть C abs
, или это может быть набор перегрузки, включая версию для double
, например std::abs
.
С Clang on Linux, по крайней мере в моей среде, это второй вариант: C abs
. Это вызывает два предупреждения, даже если они явно не позволяют:
<source>:7:9: warning: using integer absolute value function 'abs' when argument is of floating point type [-Wabsolute-value]
if (abs(-0.75) != 0.75) {
^
<source>:7:9: note: use function 'std::abs' instead
if (abs(-0.75) != 0.75) {
^~~
std::abs
<source>:7:13: warning: implicit conversion from 'double' to 'int' changes value from -0.75 to 0 [-Wliteral-conversion]
if (abs(-0.75) != 0.75) {
~~~ ^~~~~
В GCC я получаю разные результаты в разных средах, и я еще не понял, какие детали окружающей среды актуальны. Однако более распространенным вариантом является то, что он вызывает функцию C abs
. Однако даже при -Wall -Wextra -pedantic
он не дает никаких предупреждений. Я могу заставить предупреждение с -Wfloat-conversion
, но это дает слишком много ложных срабатываний на остальной части моей кодовой базы (что, возможно, я должен исправить, но это другая проблема):
<source>: In function 'int main()':
<source>:7:18: warning: conversion to 'int' alters 'double' constant value [-Wfloat-conversion]
if (abs(-0.75) != 0.75) {
^
Есть ли способ получить предупреждение, когда я использую библиотечную функцию через глобальное пространство имен, когда версия в пространстве имен std
является перегрузкой?