Разрешение пространства имен C++ ("автоматическое использование" на основе аргументов?)

Когда я вызываю функцию, объявленную в пространстве имен из-за пределов этого пространства имен, мне обычно нужно явно указать префикс пространства имен:

namespace ns1 {
    void myfunc();
}

myfunc();        // compiler complains
ns1::myfunc();   // good

Однако у меня есть такая ситуация, когда кажется, что компилятор может автоматически придумать, какую функцию я хочу использовать:

namespace mymath {
    struct Vector3 {
        float x, y, z;
    };
    Vector3 vector_cross(const Vector3& lhs, const Vector3 &rhs)
    {
        return lhs; // Pretend this is a cross product
    }
} // ns

int main(int argc, char** argv)
{
    mymath::Vector3 v, w, x;
    x = vector_cross(v, w);   // <---- Here, I do not need to
                              //       prefix with the namespace
    return 0;
}

В1: Это потому, что компилятор может автоматически выбирать соответствующую функцию в зависимости от типа аргументов? Или что-то другое?


После дополнительного тестирования я обнаружил, что мой компилятор не жалуется, если я добавлю другую функцию с таким же объявлением в другое пространство имен:

namespace mymath {
    // same as above
} // ns

namespace math2 {
    mymath::Vector3 vector_cross(const mymath::Vector3& lhs, const mymath::Vector3 &rhs)
    {
        return rhs; // Return rhs this time
    }
} // ns

int main(int argc, char** argv)
{
    mymath::Vector3 v, w, x;
    x = vector_cross(v, w);   // <---- Here, which one did the compiler chose?
    return 0;
}

Q2: Как я могу деактивировать это поведение?

Редактировать: Мой компилятор: gcc version 4.7.2 (Debian 4.7.2-5)

1 ответ

Решение

Вопрос 1: "соответствующий" обсуждается, но, по сути, да, он выбирает функцию, объединяющую все виды "связанных" пространств имен, которая отлично работает для многих выборок.

Q2: Вы заставляете несколько десятков человек присоединиться к WG21 и, наконец, проголосовать за одно из предложений "исправить ADL" к жизни, пока что попытки не увенчались успехом.

Q2, прагматичный ответ: ADL применяется только к неквалифицированному поиску, поэтому у вас всегда есть возможность использовать квалифицированные имена. (префикс:: std:: и так далее...). Или полностью прекратите использовать пространства имен. Кроме этого вы подчиняетесь принципу неопределенности Кенига.

Другие вопросы по тегам