Перегрузка не учитывается, хотя выглядит лучше - PullRequest
3 голосов
/ 17 октября 2019

Это отклонено как gcc (live on godbolt) , так и clang:

#include <string>

namespace
{
    std::string
    to_string(char const (&str) [14])
    { return str; }
}

void f()
{
    using std::to_string;
    char const hello[14] = "Hello, World!";
    (void) to_string(hello);
}

Компилятор учитывает каждую из std::to_string перегрузок и делает выводс:

error: no matching function for call to 'to_string(const char [14])'

Если я удаляю using std::to_string, моя перегрузка считается и вызывается. Почему? Как это исправить (кроме удаления с помощью )?

Ответы [ 2 ]

3 голосов
/ 17 октября 2019

Это использование объявления

using std::to_string;

скрывает объявление в глобальном пространстве имен. Таким образом, компилятор не видит функцию :: to_string.

Таким образом, вы должны написать

using std::to_string;
using ::to_string;

и сделать пространство имен без имени встроенным.

inline namespace
{
    // ...
}
3 голосов
/ 17 октября 2019

Область применения декларации имеет значение. Это правильное объявление, поэтому скрытие имени вступает в силу. Внутри функции версия глобальной области видимости не видна. Вы должны повторно ввести это:

using ::to_string;
using std::to_string;
...