Имам този клас encrypted_string, който трябва да шифрова низове по време на компилация. Проблемът, който имам, е, че не мога да извикам членската функция „encrypt“ в конструктора, но ако поставя криптирането в самия конструктор, то работи.
template<typename I>
class encrypted_string;
template<size_t... I>
class encrypted_string<std::index_sequence<I...>>
{
private:
std::array<char, sizeof...(I)> buf;
constexpr char encrypt(char c) const { return c ^ 0x41; }
public:
constexpr encrypted_string(const char* str)
: buf { (str[I] ^ 0x41)... } { } // Works
//: buf { this->encrypt(str[I])... } { } // Error
};
#define enc(str) encrypted_string<std::make_index_sequence<sizeof(str)>>(str)
int main()
{
// Ensures compile time evaluation
constexpr auto s = enc("Test");
return 0;
}
Компилирам с 'g++ encrypted_string.cpp -std=c++14 -o encrypted_string' и моята gcc версия е 4.9.2.
Грешката, която получавам, не ми казва много:
encrypted_string.cpp:17:13: note: ‘constexpr encrypted_string<std::integer_sequence<long unsigned int, _Idx ...> >::encrypted_string(const char*) [with long unsigned int ...I = {0ul, 1ul, 2ul, 3ul, 4ul}]’ is not usable as a constexpr function because:
constexpr encrypted_string(const char* str) : buf { this->encrypt(str[I])... } { }
Правя ли нещо нередно или просто не е възможно да извикам функции constexpr в конструктора constexpr? От това, което разбрах за конструкторите constexpr, би трябвало да е възможно.
constexpr
се оценява по време на компилиране, така че предполагам, че извикването на методи, които са част от екземпляр на клас, не е правилно валидна заявка. Не съм сигурен в това, но има смисъл поне за мен. - person skypjack   schedule 27.06.2015static
или не член. - person Tomilov Anatoliy   schedule 27.06.2015static
както Orient посочи. Актуализирах до gcc 5.1 и сега работи, както очаквах, без никакви модификации. - person Freszone   schedule 28.06.2015