Почему cpp выполняет две разные реализации одних и тех же функций, основываясь на возможности оценить результат во времяC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему cpp выполняет две разные реализации одних и тех же функций, основываясь на возможности оценить результат во время

Сообщение Anonymous »

В следующем коде используются две совершенно разные реализации std::find в зависимости от того, можно ли выполнить сравнение во время компиляции. Если компилятор может сравнивать строки const char* во время компиляции, используется литеральная функция сравнения строк. Однако, если это невозможно, выполняется сравнение указателей во время выполнения. В чем причина такой реализации?

Код: Выделить всё

constexpr std::array args = {"some arg", "some other arg", "--runtime"};

int main()
{
if (auto iter = std::ranges::find(args, "--runtime"); iter == std::end(args))
{
assert(false && "comptime");
}
// let's go with runtime now
if(setenv("RUNTIME", args[2], 0) != 0)
{
assert(false && "setenv");
}
char* runtime_str = getenv("RUNTIME");
assert(strcmp(runtime_str, args[2]) == 0 &&
"equal strings");

if (auto magick_iter = std::ranges::find(args, runtime_str);
magick_iter == std::end(args))
{
assert(false && "runtime");
}
}
Я понимаю, что могу выполнить сравнение строк с помощью функции std::find_if, но я просто не понимаю, почему поведение функции отличается в зависимости от возможности выполнять вычисления во время компиляции


Подробнее здесь: https://stackoverflow.com/questions/798 ... s-based-on
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»