Cześć.
Z tego co rozumiem to w poniższym przykładzie wszystko powinno wykonać się na przy kompilacji i jedyna rzecz runtime to wypisanie true. Patrząc na dump programu to first i second nadal się tam znajduje, co prawda nie jest wykorzystywane nigdzie w kodzie ale jednak tam jest. Jaki jest powód takiego zachowania? Czy da się temu zapobiec? Kompilator to msvc 2017, pełna optymalizacja włączona.
#include <iostream>
constexpr const char* values[] {
"first",
"second"
};
constexpr bool are_strings_equal(const char* first, const char* second) {
return *first == *second
&& (*first == '\0' ||
are_strings_equal(first + 1, second + 1));
}
constexpr bool is_valid_value(const char* key) {
for (auto element : values)
if (are_strings_equal(element, key))
return true;
return false;
}
int main() {
constexpr auto exist = is_valid_value("first");
std::cout << "exist: " << std::boolalpha << exist << std::endl;
return 0;
}