Причина в том, что declval
генерирует временный объект, поэтому, если у вашего кода есть другая перегрузка, такая как
ostream& operator<<(ostream&& out, const Foo& foo) noexcept { return out << foo.value; }
, он будет работать. Обратите внимание, что перегруженная функция принимает ссылку на rvalue. Я проверил это с gcc 4.8.5 и -std=c++11
.
Вам нужен, по крайней мере, доступ для записи к файловой системе, чтобы смочь дешифровать его, предполагая использование поставщика DPAPI. Способы дешифровать его включают:
Но это защищает от дешифрования неавторизованным пользователем, у которого есть доступ для чтения к файловой системе или резервному копированию файловой системы.
Обычно Вы настроили бы свои рабочие серверы так, чтобы только авторизованный adminstrators мог войти в систему сервера или записать в свою файловую систему.
Разработчики могли бы иметь удаленный доступ для чтения в целях поддержки и не смогут дешифровать файл конфигурации удаленно.
Шифрование/дешифрование легко со стандартными библиотеками: твердая часть гарантирует, чтобы только у авторизованных людей был доступ к ключам.
При использовании DPAPI Вы по существу делегируете управление ключами к безопасности Windows. При использовании другого поставщика, такого как RSA необходимо сохранить ключ где-нибудь и защитить его от несанкционированного доступа, например, использования ACL.