Помимо использования его, как предназначено, энергозависимый используется в (шаблоне) метапрограммирование. Это может использоваться для предотвращения случайной перегрузки, поскольку энергозависимый атрибут (как константа) принимает участие в разрешении перегрузки.
template <typename T>
class Foo {
std::enable_if_t<sizeof(T)==4, void> f(T& t)
{ std::cout << 1 << t; }
void f(T volatile& t)
{ std::cout << 2 << const_cast<T&>(t); }
void bar() { T t; f(t); }
};
Это законно; обе перегрузки являются потенциально вызываемыми и делают почти то же. Бросок в volatile
перегрузка законна, поскольку мы знаем, что панель не передаст энергонезависимое T
так или иначе. volatile
версия строго хуже, тем не менее, поэтому никогда не выбираемая в разрешении перегрузки, если энергонезависимое f
доступно.
Примечание, что код никогда на самом деле зависит от volatile
доступ к памяти.
Недавно я столкнулся с этой проблемой на Railscamp, и, к счастью, Тим Лукас смог указать мне на то, что он разветвлял и над которым работал, под названием sinatra-content-for . Это покроет все, что вам нужно.